ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IDU1Njc4NGYuLmZiZmYxYWEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMzEsNiArMzEsNyBAQAogICAgICAgICAibGliYm9vdGxvYWRlcl9tZXNzYWdlIiwKICAgICAgICAgImxpYmZlYyIsCiAgICAgICAgICJsaWJmZWNfcnMiLAorICAgICAgICAibGliZnNfYXZiIiwKICAgICAgICAgImxpYmZzX21nciIsCiAgICAgICAgICJsaWJzY3J5cHRfc3RhdGljIiwKICAgICAgICAgImxpYnNxdWFzaGZzX3V0aWxzIiwKQEAgLTM5LDYgKzQwLDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5rZXltYXN0ZXJAMy4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUua2V5bWFzdGVyQDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJvb3RAMS4wIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNyeXB0byIsCkBAIC00Nyw2ICs0OSw3IEBACiAgICAgICAgICJsaWJkaXNrY29uZmlnIiwKICAgICAgICAgImxpYmV4dDRfdXRpbHMiLAogICAgICAgICAibGliZjJmc19zcGFyc2VibG9jayIsCisgICAgICAgICJsaWJmc2NyeXB0IiwKICAgICAgICAgImxpYmhhcmR3YXJlIiwKICAgICAgICAgImxpYmhhcmR3YXJlX2xlZ2FjeSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCkBAIC05MywxMiArOTYsMTQgQEAKICAgICBdLAogCiAgICAgc3JjczogWworICAgICAgICAiQXBwRnVzZVV0aWwuY3BwIiwKICAgICAgICAgIkJlbmNobWFyay5jcHAiLAogICAgICAgICAiQ2hlY2tFbmNyeXB0aW9uLmNwcCIsCisgICAgICAgICJDaGVja3BvaW50LmNwcCIsCiAgICAgICAgICJEZXZtYXBwZXIuY3BwIiwKICAgICAgICAgIkVuY3J5cHRJbnBsYWNlLmNwcCIsCi0gICAgICAgICJFeHQ0Q3J5cHQuY3BwIiwKICAgICAgICAgIkZpbGVEZXZpY2VVdGlscy5jcHAiLAorICAgICAgICAiRnNDcnlwdC5jcHAiLAogICAgICAgICAiSWRsZU1haW50LmNwcCIsCiAgICAgICAgICJLZXlCdWZmZXIuY3BwIiwKICAgICAgICAgIktleVN0b3JhZ2UuY3BwIiwKQEAgLTEyNiwxOSArMTMxLDI5IEBACiAgICAgICAgICJtb2RlbC9Qcml2YXRlVm9sdW1lLmNwcCIsCiAgICAgICAgICJtb2RlbC9QdWJsaWNWb2x1bWUuY3BwIiwKICAgICAgICAgIm1vZGVsL1ZvbHVtZUJhc2UuY3BwIiwKKyAgICAgICAgIm1vZGVsL1N0dWJWb2x1bWUuY3BwIiwKICAgICAgICAgInNlY29udGV4dC5jcHAiLAogICAgIF0sCiAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKICAgICAgICAgYXJjOiB7CiAgICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKKyAgICAgICAgICAgICAgICAiQXBwRnVzZVV0aWwuY3BwIiwKICAgICAgICAgICAgICAgICAibW9kZWwvT2JiVm9sdW1lLmNwcCIsCiAgICAgICAgICAgICBdLAogICAgICAgICAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgICAgICAgICAiYXJjX3NlcnZpY2VzX2FpZGwiLAorICAgICAgICAgICAgICAgICJsaWJhcmNhcHBmdXNlIiwKICAgICAgICAgICAgICAgICAibGliYXJjb2Jidm9sdW1lIiwKKyAgICAgICAgICAgICAgICAibGlicGFyY2VsZmlsZWRlc2NyaXB0b3IiLAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKKyAgICAgICAgZGVidWdnYWJsZTogeworICAgICAgICAgICAgY3BwZmxhZ3M6IFsiLURfX0FORFJPSURfREVCVUdHQUJMRV9fIl0sCisgICAgICAgIH0sCiAgICAgfSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGguc3RvcmFnZUAxLjAiLAorICAgIF0sCiB9CiAKIGNjX2JpbmFyeSB7CkBAIC0xNTQsNyArMTY5LDkgQEAKICAgICAgICAgYXJjOiB7CiAgICAgICAgICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAgICAgICAgICJhcmNfc2VydmljZXNfYWlkbCIsCisgICAgICAgICAgICAgICAgImxpYmFyY2FwcGZ1c2UiLAogICAgICAgICAgICAgICAgICJsaWJhcmNvYmJ2b2x1bWUiLAorICAgICAgICAgICAgICAgICJsaWJwYXJjZWxmaWxlZGVzY3JpcHRvciIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAogICAgIH0sCkBAIC0xNjgsNiArMTg1LDExIEBACiAgICAgICAgICJ2b2xkX3ByZXBhcmVfc3ViZGlycyIsCiAgICAgICAgICJ3YWl0X2Zvcl9rZXltYXN0ZXIiLAogICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGguc3RvcmFnZUAxLjAiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgXSwKIH0KIAogY2NfYmluYXJ5IHsKZGlmZiAtLWdpdCBhL0FwcEZ1c2VVdGlsLmNwcCBiL0FwcEZ1c2VVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTgyYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvQXBwRnVzZVV0aWwuY3BwCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFwcEZ1c2VVdGlsLmgiCisKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCisjaW5jbHVkZSAiVXRpbHMuaCIKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugdm9sZCB7CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBzaXplX3Qga0FwcEZ1c2VNYXhNb3VudFBvaW50TmFtZSA9IDMyOworCitzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgR2V0TW91bnRQYXRoKHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nKiBwYXRoKSB7CisgICAgaWYgKG5hbWUuc2l6ZSgpID4ga0FwcEZ1c2VNYXhNb3VudFBvaW50TmFtZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJBcHBGdXNlIG1vdW50IG5hbWUgaXMgdG9vIGxvbmcuIjsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIWlzYWxudW0obmFtZVtpXSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkFwcEZ1c2UgbW91bnQgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3Rlci4iOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBhdGggPSBTdHJpbmdQcmludGYoIi9tbnQvYXBwZnVzZS8lZF8lcyIsIHVpZCwgbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK3N0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBNb3VudChpbnQgZGV2aWNlX2ZkLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIC8vIFJlbW92ZSBleGlzdGluZyBtb3VudC4KKyAgICBhbmRyb2lkOjp2b2xkOjpGb3JjZVVubW91bnQocGF0aCk7CisKKyAgICBjb25zdCBhdXRvIG9wdHMgPSBTdHJpbmdQcmludGYoCisgICAgICAgICJmZD0laSwiCisgICAgICAgICJyb290bW9kZT00MDAwMCwiCisgICAgICAgICJkZWZhdWx0X3Blcm1pc3Npb25zLCIKKyAgICAgICAgImFsbG93X290aGVyLCIKKyAgICAgICAgInVzZXJfaWQ9MCxncm91cF9pZD0wLCIKKyAgICAgICAgImNvbnRleHQ9XCJ1Om9iamVjdF9yOmFwcF9mdXNlX2ZpbGU6czBcIiwiCisgICAgICAgICJmc2NvbnRleHQ9dTpvYmplY3RfcjphcHBfZnVzZWZzOnMwIiwKKyAgICAgICAgZGV2aWNlX2ZkKTsKKworICAgIGNvbnN0IGludCByZXN1bHQgPQorICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkobW91bnQoIi9kZXYvZnVzZSIsIHBhdGguY19zdHIoKSwgImZ1c2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNfTk9TVUlEIHwgTVNfTk9ERVYgfCBNU19OT0VYRUMgfCBNU19OT0FUSU1FLCBvcHRzLmNfc3RyKCkpKTsKKyAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtb3VudCAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgUnVuQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCwgdWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfZmQpIHsKKyAgICBpZiAoREVCVUdfQVBQRlVTRSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJSdW4gYXBwIGZ1c2UgY29tbWFuZCAiIDw8IGNvbW1hbmQgPDwgIiBmb3IgdGhlIHBhdGggIiA8PCBwYXRoIDw8ICIgYW5kIHVpZCAiCisgICAgICAgICAgICAgICAgICAgPDwgdWlkOworICAgIH0KKworICAgIGlmIChjb21tYW5kID09ICJtb3VudCIpIHsKKyAgICAgICAgcmV0dXJuIE1vdW50KGRldmljZV9mZCwgcGF0aCk7CisgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJ1bm1vdW50IikgeworICAgICAgICAvLyBJZiBpdCdzIGp1c3QgYWZ0ZXIgYWxsIEZEIG9wZW5lZCBvbiBtb3VudCBwb2ludCBhcmUgY2xvc2VkLCB1bW91bnQyIGNhbiBmYWlsIHdpdGgKKyAgICAgICAgLy8gRUJVU1kuIFRvIGF2b2lkIHRoZSBjYXNlLCBzcGVjaWZ5IE1OVF9ERVRBQ0guCisgICAgICAgIGlmICh1bW91bnQyKHBhdGguY19zdHIoKSwgVU1PVU5UX05PRk9MTE9XIHwgTU5UX0RFVEFDSCkgIT0gMCAmJiBlcnJubyAhPSBFSU5WQUwgJiYKKyAgICAgICAgICAgIGVycm5vICE9IEVOT0VOVCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB1bm1vdW50IGRpcmVjdG9yeS4iOworICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgfQorICAgICAgICBpZiAocm1kaXIocGF0aC5jX3N0cigpKSAhPSAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlbW92ZSB0aGUgbW91bnQgZGlyZWN0b3J5LiI7CisgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpPSzsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGFwcGZ1c2UgY29tbWFuZCAiIDw8IGNvbW1hbmQ7CisgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgfQorCisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IE1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBzdGQ6OnRvX3N0cmluZyhtb3VudElkKTsKKworICAgIC8vIENoZWNrIG1vdW50IHBvaW50IG5hbWUuCisgICAgc3RkOjpzdHJpbmcgcGF0aDsKKyAgICBpZiAoR2V0TW91bnRQYXRoKHVpZCwgbmFtZSwgJnBhdGgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgbW91bnQgcG9pbnQgbmFtZSI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgZGlyZWN0b3JpZXMuCisgICAgY29uc3QgYW5kcm9pZDo6c3RhdHVzX3QgcmVzdWx0ID0gYW5kcm9pZDo6dm9sZDo6UHJlcGFyZURpcihwYXRoLCAwNzAwLCAwLCAwKTsKKyAgICBpZiAocmVzdWx0ICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcHJlcGFyZSBkaXJlY3RvcnkgIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gT3BlbiBkZXZpY2UgRkQuCisgICAgZGV2aWNlX2ZkLT5yZXNldChvcGVuKCIvZGV2L2Z1c2UiLCBPX1JEV1IpKTsgIC8vIG5vdCBPX0NMT0VYRUMKKyAgICBpZiAoZGV2aWNlX2ZkLT5nZXQoKSA9PSAtMSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gL2Rldi9mdXNlIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIE1vdW50LgorICAgIHJldHVybiBSdW5Db21tYW5kKCJtb3VudCIsIHVpZCwgcGF0aCwgZGV2aWNlX2ZkLT5nZXQoKSk7Cit9CisKK2ludCBVbm1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkKSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6dG9fc3RyaW5nKG1vdW50SWQpOworCisgICAgLy8gQ2hlY2sgbW91bnQgcG9pbnQgbmFtZS4KKyAgICBzdGQ6OnN0cmluZyBwYXRoOworICAgIGlmIChHZXRNb3VudFBhdGgodWlkLCBuYW1lLCAmcGF0aCkgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBtb3VudCBwb2ludCBuYW1lIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBSdW5Db21tYW5kKCJ1bm1vdW50IiwgdWlkLCBwYXRoLCAtMSAvKiBkZXZpY2VfZmQgKi8pOworfQorCitpbnQgT3BlbkFwcEZ1c2VGaWxlKHVpZF90IHVpZCwgaW50IG1vdW50SWQsIGludCBmaWxlSWQsIGludCBmbGFncykgeworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBzdGQ6OnRvX3N0cmluZyhtb3VudElkKTsKKworICAgIC8vIENoZWNrIG1vdW50IHBvaW50IG5hbWUuCisgICAgc3RkOjpzdHJpbmcgbW91bnRQb2ludDsKKyAgICBpZiAoR2V0TW91bnRQYXRoKHVpZCwgbmFtZSwgJm1vdW50UG9pbnQpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgbW91bnQgcG9pbnQgbmFtZSI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gU3RyaW5nUHJpbnRmKCIlcy8lZCIsIG1vdW50UG9pbnQuY19zdHIoKSwgZmlsZUlkKTsKKyAgICByZXR1cm4gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGF0aC5jX3N0cigpLCBmbGFncykpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL0FwcEZ1c2VVdGlsLmggYi9BcHBGdXNlVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2M2M2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9BcHBGdXNlVXRpbC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVk9MRF9BUFBfRlVTRV9VVElMX0hfCisjZGVmaW5lIEFORFJPSURfVk9MRF9BUFBfRlVTRV9VVElMX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisKKyNkZWZpbmUgREVCVUdfQVBQRlVTRSAwCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB2b2xkIHsKKworaW50IE1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCk7CisKK2ludCBVbm1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkKTsKKworaW50IE9wZW5BcHBGdXNlRmlsZSh1aWRfdCB1aWQsIGludCBtb3VudElkLCBpbnQgZmlsZUlkLCBpbnQgZmxhZ3MpOworCit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1ZPTERfQVBQX0ZVU0VfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvQmVuY2htYXJrLmNwcCBiL0JlbmNobWFyay5jcHAKaW5kZXggZGZlMzM2Ni4uYjBhM2I4NSAxMDA2NDQKLS0tIGEvQmVuY2htYXJrLmNwcAorKysgYi9CZW5jaG1hcmsuY3BwCkBAIC0yOCw4ICsyOCw4IEBACiAKICNpbmNsdWRlIDx0aHJlYWQ+CiAKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmc7CkBAIC01MCwxMiArNTAsMTIgQEAKIAogLy8gUkFJSSBjbGFzcyBmb3IgYm9vc3RpbmcgZGV2aWNlIHBlcmZvcm1hbmNlIGR1cmluZyBiZW5jaG1hcmtzLgogY2xhc3MgUGVyZm9ybWFuY2VCb29zdCB7Ci1wcml2YXRlOgorICBwcml2YXRlOgogICAgIGludCBvcmlnX3ByaW87CiAgICAgaW50IG9yaWdfaW9wcmlvOwogICAgIElvU2NoZWRDbGFzcyBvcmlnX2NsYXp6OwogCi1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBQZXJmb3JtYW5jZUJvb3N0KCkgewogICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgIG9yaWdfcHJpbyA9IGdldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCk7CkBAIC04Nyw4ICs4Nyw4IEBACiB9OwogCiBzdGF0aWMgc3RhdHVzX3QgYmVuY2htYXJrSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHJvb3RQYXRoLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lciwKLSAgICAgICAgYW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlKiBleHRyYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGUqIGV4dHJhcykgewogICAgIHN0YXR1c190IHJlcyA9IDA7CiAKICAgICBhdXRvIHBhdGggPSByb290UGF0aDsKQEAgLTEzNywxMiArMTM3LDEyIEBACiAgICAgLy8gT25seSBkcm9wIHdoZW4gd2UgaGF2ZW4ndCBhYm9ydGVkCiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBhbmRyb2lkOjpiYXNlOjpUaW1lciB0aW1lcjsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJCZWZvcmUgZHJvcF9jYWNoZXMiOworICAgICAgICBMT0coREVCVUcpIDw8ICJCZWZvcmUgZHJvcF9jYWNoZXMiOwogICAgICAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlKCIzIiwgIi9wcm9jL3N5cy92bS9kcm9wX2NhY2hlcyIpKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRyb3BfY2FjaGVzIjsKICAgICAgICAgICAgIHJlcyA9IC0xOwogICAgICAgICB9Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQWZ0ZXIgZHJvcF9jYWNoZXMiOworICAgICAgICBMT0coREVCVUcpIDw8ICJBZnRlciBkcm9wX2NhY2hlcyI7CiAgICAgICAgIHN5bmMoKTsKICAgICAgICAgaWYgKHJlcyA9PSBPSykgZXh0cmFzLT5wdXRMb25nKFN0cmluZzE2KCJkcm9wIiksIHRpbWVyLmR1cmF0aW9uKCkuY291bnQoKSk7CiAgICAgfQpAQCAtMTc5LDcgKzE3OSw3IEBACiB9CiAKIHZvaWQgQmVuY2htYXJrKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhrQmVuY2htYXJrTG9jayk7CiAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIGtXYWtlTG9jayk7CiAKZGlmZiAtLWdpdCBhL0JlbmNobWFyay5oIGIvQmVuY2htYXJrLmgKaW5kZXggNGYxOWIwMS4uZDU4ODJjZCAxMDA2NDQKLS0tIGEvQmVuY2htYXJrLmgKKysrIGIvQmVuY2htYXJrLmgKQEAgLTI0LDggKzI0LDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CiAKKy8vIGNsYW5nLWZvcm1hdCBvZmYKIHZvaWQgQmVuY2htYXJrKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisvLyBjbGFuZy1mb3JtYXQgb24KIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9DaGVja3BvaW50LmNwcCBiL0NoZWNrcG9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzhhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9DaGVja3BvaW50LmNwcApAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2hlY2twb2ludCIKKyNpbmNsdWRlICJDaGVja3BvaW50LmgiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYm9vdC8xLjAvSUJvb3RDb250cm9sLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfcmVib290Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJvb3Q6OlYxXzA6OkJvb2xSZXN1bHQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Ym9vdDo6VjFfMDo6SUJvb3RDb250cm9sOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJvb3Q6OlYxXzA6OlNsb3Q7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB2b2xkIHsKKworbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtNZXRhZGF0YUNQRmlsZSA9ICIvbWV0YWRhdGEvdm9sZC9jaGVja3BvaW50IjsKKworYm9vbCBzZXRCb3dTdGF0ZShzdGQ6OnN0cmluZyBjb25zdCYgYmxvY2tfZGV2aWNlLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RhdGUpIHsKKyAgICBpZiAoYmxvY2tfZGV2aWNlLnN1YnN0cigwLCA1KSAhPSAiL2Rldi8iKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkV4cGVjdGVkIGJsb2NrIGRldmljZSwgZ290ICIgPDwgYmxvY2tfZGV2aWNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc3RhdGVfZmlsZW5hbWUgPSBzdGQ6OnN0cmluZygiL3N5cy8iKSArIGJsb2NrX2RldmljZS5zdWJzdHIoNSkgKyAiL2Jvdy9zdGF0ZSI7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZShzdGF0ZSwgc3RhdGVfZmlsZW5hbWUpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gd3JpdGUgdG8gZmlsZSAiIDw8IHN0YXRlX2ZpbGVuYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitTdGF0dXMgY3Bfc3RhcnRDaGVja3BvaW50KGludCByZXRyeSkgeworICAgIGlmIChyZXRyeSA8IC0xKSByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJSZXRyeSBjb3VudCBtdXN0IGJlIG1vcmUgdGhhbiAtMSIpOworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQgPSBzdGQ6OnRvX3N0cmluZyhyZXRyeSArIDEpOworICAgIGlmIChyZXRyeSA9PSAtMSkgeworICAgICAgICBzcDxJQm9vdENvbnRyb2w+IG1vZHVsZSA9IElCb290Q29udHJvbDo6Z2V0U2VydmljZSgpOworICAgICAgICBpZiAobW9kdWxlKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICBhdXRvIGNiID0gWyZzdWZmaXhdKGhpZGxfc3RyaW5nIHMpIHsgc3VmZml4ID0gczsgfTsKKyAgICAgICAgICAgIGlmIChtb2R1bGUtPmdldFN1ZmZpeChtb2R1bGUtPmdldEN1cnJlbnRTbG90KCksIGNiKS5pc09rKCkpIGNvbnRlbnQgKz0gIiAiICsgc3VmZml4OworICAgICAgICB9CisgICAgfQorICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUoY29udGVudCwga01ldGFkYXRhQ1BGaWxlKSkKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoZXJybm8sICJGYWlsZWQgdG8gd3JpdGUgY2hlY2twb2ludCBmaWxlIik7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIGNwX2NvbW1pdENoYW5nZXMoKSB7CisgICAgaWYgKCFjcF9uZWVkc0NoZWNrcG9pbnQoKSkgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICAvLyBNdXN0IHRha2UgYWN0aW9uIGZvciBsaXN0IG9mIG1vdW50ZWQgY2hlY2twb2ludGVkIHRoaW5ncyBoZXJlCisgICAgLy8gVG8gZG8gdGhpcywgd2Ugd2FsayB0aGUgbGlzdCBvZiBtb3VudGVkIGZpbGUgc3lzdGVtcy4KKyAgICAvLyBCdXQgd2UgYWxzbyBuZWVkIHRvIGdldCB0aGUgbWF0Y2hpbmcgZnN0YWIgZW50cmllcyB0byBzZWUKKyAgICAvLyB0aGUgb3JpZ2luYWwgZmxhZ3MKKyAgICBzdGQ6OnN0cmluZyBlcnJfc3RyOworICAgIGF1dG8gZnN0YWJfZGVmYXVsdCA9IHN0ZDo6dW5pcXVlX3B0cjxmc3RhYiwgZGVjbHR5cGUoJmZzX21ncl9mcmVlX2ZzdGFiKT57CisgICAgICAgIGZzX21ncl9yZWFkX2ZzdGFiX2RlZmF1bHQoKSwgZnNfbWdyX2ZyZWVfZnN0YWJ9OworICAgIGlmICghZnN0YWJfZGVmYXVsdCkgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoRUlOVkFMLCAiRmFpbGVkIHRvIGdldCBmc3RhYiIpOworCisgICAgYXV0byBtb3VudHMgPSBzdGQ6OnVuaXF1ZV9wdHI8ZnN0YWIsIGRlY2x0eXBlKCZmc19tZ3JfZnJlZV9mc3RhYik+eworICAgICAgICBmc19tZ3JfcmVhZF9mc3RhYigiL3Byb2MvbW91bnRzIiksIGZzX21ncl9mcmVlX2ZzdGFifTsKKyAgICBpZiAoIW1vdW50cykgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoRUlOVkFMLCAiRmFpbGVkIHRvIGdldCAvcHJvYy9tb3VudHMiKTsKKworICAgIC8vIFdhbGsgbW91bnRlZCBmaWxlIHN5c3RlbXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vdW50cy0+bnVtX2VudHJpZXM7ICsraSkgeworICAgICAgICBjb25zdCBmc3RhYl9yZWMqIG1vdW50X3JlYyA9ICZtb3VudHMtPnJlY3NbaV07CisgICAgICAgIGNvbnN0IGZzdGFiX3JlYyogZnN0YWJfcmVjID0KKyAgICAgICAgICAgIGZzX21ncl9nZXRfZW50cnlfZm9yX21vdW50X3BvaW50KGZzdGFiX2RlZmF1bHQuZ2V0KCksIG1vdW50X3JlYy0+bW91bnRfcG9pbnQpOworICAgICAgICBpZiAoIWZzdGFiX3JlYykgY29udGludWU7CisKKyAgICAgICAgaWYgKGZzX21ncl9pc19jaGVja3BvaW50X2ZzKGZzdGFiX3JlYykpIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGZzdGFiX3JlYy0+ZnNfdHlwZSwgImYyZnMiKSkgeworICAgICAgICAgICAgICAgIGlmIChtb3VudChtb3VudF9yZWMtPmJsa19kZXZpY2UsIG1vdW50X3JlYy0+bW91bnRfcG9pbnQsICJub25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTVNfUkVNT1VOVCB8IGZzdGFiX3JlYy0+ZmxhZ3MsICJjaGVja3BvaW50PWVuYWJsZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKEVJTlZBTCwgIkZhaWxlZCB0byByZW1vdW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZzX21ncl9pc19jaGVja3BvaW50X2Jsayhmc3RhYl9yZWMpKSB7CisgICAgICAgICAgICBpZiAoIXNldEJvd1N0YXRlKG1vdW50X3JlYy0+YmxrX2RldmljZSwgIjIiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJGYWlsZWQgdG8gc2V0IGJvdyBzdGF0ZSIpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVtb3ZlRmlsZUlmRXhpc3RzKGtNZXRhZGF0YUNQRmlsZSwgJmVycl9zdHIpKQorICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShlcnJubywgZXJyX3N0ci5jX3N0cigpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgY3BfYWJvcnRDaGFuZ2VzKCkgeworICAgIGFuZHJvaWRfcmVib290KEFORFJPSURfUkJfUkVTVEFSVDIsIDAsIG51bGxwdHIpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK2Jvb2wgY3BfbmVlZHNSb2xsYmFjaygpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgIGJvb2wgcmV0OworCisgICAgcmV0ID0gYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhrTWV0YWRhdGFDUEZpbGUsICZjb250ZW50KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGlmIChjb250ZW50ID09ICIwIikgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChjb250ZW50LnN1YnN0cigwLCAzKSA9PSAiLTEgIikgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2xkU3VmZml4ID0gY29udGVudC5zdWJzdHIoMyk7CisgICAgICAgICAgICBzcDxJQm9vdENvbnRyb2w+IG1vZHVsZSA9IElCb290Q29udHJvbDo6Z2V0U2VydmljZSgpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3U3VmZml4OworCisgICAgICAgICAgICBpZiAobW9kdWxlKSB7CisgICAgICAgICAgICAgICAgYXV0byBjYiA9IFsmbmV3U3VmZml4XShoaWRsX3N0cmluZyBzKSB7IG5ld1N1ZmZpeCA9IHM7IH07CisgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXRTdWZmaXgobW9kdWxlLT5nZXRDdXJyZW50U2xvdCgpLCBjYik7CisgICAgICAgICAgICAgICAgaWYgKG9sZFN1ZmZpeCA9PSBuZXdTdWZmaXgpIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBjcF9uZWVkc0NoZWNrcG9pbnQoKSB7CisgICAgYm9vbCByZXQ7CisgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICBzcDxJQm9vdENvbnRyb2w+IG1vZHVsZSA9IElCb290Q29udHJvbDo6Z2V0U2VydmljZSgpOworCisgICAgaWYgKG1vZHVsZSAmJiBtb2R1bGUtPmlzU2xvdE1hcmtlZFN1Y2Nlc3NmdWwobW9kdWxlLT5nZXRDdXJyZW50U2xvdCgpKSA9PSBCb29sUmVzdWx0OjpGQUxTRSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0ID0gYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhrTWV0YWRhdGFDUEZpbGUsICZjb250ZW50KTsKKyAgICBpZiAocmV0KSByZXR1cm4gY29udGVudCAhPSAiMCI7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdGF0dXMgY3BfcHJlcGFyZUNoZWNrcG9pbnQoKSB7CisgICAgYXV0byBmc3RhYl9kZWZhdWx0ID0gc3RkOjp1bmlxdWVfcHRyPGZzdGFiLCBkZWNsdHlwZSgmZnNfbWdyX2ZyZWVfZnN0YWIpPnsKKyAgICAgICAgZnNfbWdyX3JlYWRfZnN0YWJfZGVmYXVsdCgpLCBmc19tZ3JfZnJlZV9mc3RhYn07CisgICAgaWYgKCFmc3RhYl9kZWZhdWx0KSByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJGYWlsZWQgdG8gZ2V0IGZzdGFiIik7CisKKyAgICBhdXRvIG1vdW50cyA9IHN0ZDo6dW5pcXVlX3B0cjxmc3RhYiwgZGVjbHR5cGUoJmZzX21ncl9mcmVlX2ZzdGFiKT57CisgICAgICAgIGZzX21ncl9yZWFkX2ZzdGFiKCIvcHJvYy9tb3VudHMiKSwgZnNfbWdyX2ZyZWVfZnN0YWJ9OworICAgIGlmICghbW91bnRzKSByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJGYWlsZWQgdG8gZ2V0IC9wcm9jL21vdW50cyIpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb3VudHMtPm51bV9lbnRyaWVzOyArK2kpIHsKKyAgICAgICAgY29uc3QgZnN0YWJfcmVjKiBtb3VudF9yZWMgPSAmbW91bnRzLT5yZWNzW2ldOworICAgICAgICBjb25zdCBmc3RhYl9yZWMqIGZzdGFiX3JlYyA9CisgICAgICAgICAgICBmc19tZ3JfZ2V0X2VudHJ5X2Zvcl9tb3VudF9wb2ludChmc3RhYl9kZWZhdWx0LmdldCgpLCBtb3VudF9yZWMtPm1vdW50X3BvaW50KTsKKyAgICAgICAgaWYgKCFmc3RhYl9yZWMpIGNvbnRpbnVlOworCisgICAgICAgIGlmIChmc19tZ3JfaXNfY2hlY2twb2ludF9ibGsoZnN0YWJfcmVjKSkgeworICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKAorICAgICAgICAgICAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKG1vdW50X3JlYy0+bW91bnRfcG9pbnQsIE9fUkRPTkxZIHwgT19DTE9FWEVDKSkpOworICAgICAgICAgICAgaWYgKCFmZCkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiBtb3VudCBwb2ludCIgPDwgbW91bnRfcmVjLT5tb3VudF9wb2ludDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RydWN0IGZzdHJpbV9yYW5nZSByYW5nZSA9IHt9OworICAgICAgICAgICAgcmFuZ2UubGVuID0gVUxMT05HX01BWDsKKyAgICAgICAgICAgIGlmIChpb2N0bChmZCwgRklUUklNLCAmcmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB0cmltICIgPDwgbW91bnRfcmVjLT5tb3VudF9wb2ludDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0Qm93U3RhdGUobW91bnRfcmVjLT5ibGtfZGV2aWNlLCAiMSIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK25hbWVzcGFjZSB7Citjb25zdCBpbnQga0Jsb2NrU2l6ZSA9IDQwOTY7Citjb25zdCBpbnQga1NlY3RvclNpemUgPSA1MTI7CisKK3R5cGVkZWYgdWludDY0X3Qgc2VjdG9yX3Q7CisKK3N0cnVjdCBsb2dfZW50cnkgeworICAgIHNlY3Rvcl90IHNvdXJjZTsKKyAgICBzZWN0b3JfdCBkZXN0OworICAgIHVpbnQzMl90IHNpemU7CisgICAgdWludDMyX3QgY2hlY2tzdW07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbG9nX3NlY3RvciB7CisgICAgdWludDMyX3QgbWFnaWM7CisgICAgdWludDMyX3QgY291bnQ7CisgICAgdWludDMyX3Qgc2VxdWVuY2U7CisgICAgc3RydWN0IGxvZ19lbnRyeSBlbnRyaWVzW107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvLyBNQUdJQyBpcyBCT1cgaW4gYXNjaWkKK2NvbnN0IGludCBrTWFnaWMgPSAweDAwNTc0ZjQyOworCit2b2lkIGNyYzMyKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBuX2J5dGVzLCB1aW50MzJfdCogY3JjKSB7CisgICAgc3RhdGljIHVpbnQzMl90IHRhYmxlWzB4MTAwXSA9IHsKKyAgICAgICAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhFRTBFNjEyQywgMHg5OTA5NTFCQSwgMHgwNzZEQzQxOSwgMHg3MDZBRjQ4RiwgMHhFOTYzQTUzNSwKKyAgICAgICAgMHg5RTY0OTVBMywgMHgwRURCODgzMiwgMHg3OURDQjhBNCwgMHhFMEQ1RTkxRSwgMHg5N0QyRDk4OCwgMHgwOUI2NEMyQiwgMHg3RUIxN0NCRCwKKyAgICAgICAgMHhFN0I4MkQwNywgMHg5MEJGMUQ5MSwgMHgxREI3MTA2NCwgMHg2QUIwMjBGMiwgMHhGM0I5NzE0OCwgMHg4NEJFNDFERSwgMHgxQURBRDQ3RCwKKyAgICAgICAgMHg2RERERTRFQiwgMHhGNEQ0QjU1MSwgMHg4M0QzODVDNywgMHgxMzZDOTg1NiwgMHg2NDZCQThDMCwgMHhGRDYyRjk3QSwgMHg4QTY1QzlFQywKKyAgICAgICAgMHgxNDAxNUM0RiwgMHg2MzA2NkNEOSwgMHhGQTBGM0Q2MywgMHg4RDA4MERGNSwgMHgzQjZFMjBDOCwgMHg0QzY5MTA1RSwgMHhENTYwNDFFNCwKKyAgICAgICAgMHhBMjY3NzE3MiwgMHgzQzAzRTREMSwgMHg0QjA0RDQ0NywgMHhEMjBEODVGRCwgMHhBNTBBQjU2QiwgMHgzNUI1QThGQSwgMHg0MkIyOTg2QywKKyAgICAgICAgMHhEQkJCQzlENiwgMHhBQ0JDRjk0MCwgMHgzMkQ4NkNFMywgMHg0NURGNUM3NSwgMHhEQ0Q2MERDRiwgMHhBQkQxM0Q1OSwgMHgyNkQ5MzBBQywKKyAgICAgICAgMHg1MURFMDAzQSwgMHhDOEQ3NTE4MCwgMHhCRkQwNjExNiwgMHgyMUI0RjRCNSwgMHg1NkIzQzQyMywgMHhDRkJBOTU5OSwgMHhCOEJEQTUwRiwKKyAgICAgICAgMHgyODAyQjg5RSwgMHg1RjA1ODgwOCwgMHhDNjBDRDlCMiwgMHhCMTBCRTkyNCwgMHgyRjZGN0M4NywgMHg1ODY4NEMxMSwgMHhDMTYxMURBQiwKKyAgICAgICAgMHhCNjY2MkQzRCwKKworICAgICAgICAweDc2REM0MTkwLCAweDAxREI3MTA2LCAweDk4RDIyMEJDLCAweEVGRDUxMDJBLCAweDcxQjE4NTg5LCAweDA2QjZCNTFGLCAweDlGQkZFNEE1LAorICAgICAgICAweEU4QjhENDMzLCAweDc4MDdDOUEyLCAweDBGMDBGOTM0LCAweDk2MDlBODhFLCAweEUxMEU5ODE4LCAweDdGNkEwREJCLCAweDA4NkQzRDJELAorICAgICAgICAweDkxNjQ2Qzk3LCAweEU2NjM1QzAxLCAweDZCNkI1MUY0LCAweDFDNkM2MTYyLCAweDg1NjUzMEQ4LCAweEYyNjIwMDRFLCAweDZDMDY5NUVELAorICAgICAgICAweDFCMDFBNTdCLCAweDgyMDhGNEMxLCAweEY1MEZDNDU3LCAweDY1QjBEOUM2LCAweDEyQjdFOTUwLCAweDhCQkVCOEVBLCAweEZDQjk4ODdDLAorICAgICAgICAweDYyREQxRERGLCAweDE1REEyRDQ5LCAweDhDRDM3Q0YzLCAweEZCRDQ0QzY1LCAweDREQjI2MTU4LCAweDNBQjU1MUNFLCAweEEzQkMwMDc0LAorICAgICAgICAweEQ0QkIzMEUyLCAweDRBREZBNTQxLCAweDNERDg5NUQ3LCAweEE0RDFDNDZELCAweEQzRDZGNEZCLCAweDQzNjlFOTZBLCAweDM0NkVEOUZDLAorICAgICAgICAweEFENjc4ODQ2LCAweERBNjBCOEQwLCAweDQ0MDQyRDczLCAweDMzMDMxREU1LCAweEFBMEE0QzVGLCAweEREMEQ3Q0M5LCAweDUwMDU3MTNDLAorICAgICAgICAweDI3MDI0MUFBLCAweEJFMEIxMDEwLCAweEM5MEMyMDg2LCAweDU3NjhCNTI1LCAweDIwNkY4NUIzLCAweEI5NjZENDA5LCAweENFNjFFNDlGLAorICAgICAgICAweDVFREVGOTBFLCAweDI5RDlDOTk4LCAweEIwRDA5ODIyLCAweEM3RDdBOEI0LCAweDU5QjMzRDE3LCAweDJFQjQwRDgxLCAweEI3QkQ1QzNCLAorICAgICAgICAweEMwQkE2Q0FELAorCisgICAgICAgIDB4RURCODgzMjAsIDB4OUFCRkIzQjYsIDB4MDNCNkUyMEMsIDB4NzRCMUQyOUEsIDB4RUFENTQ3MzksIDB4OUREMjc3QUYsIDB4MDREQjI2MTUsCisgICAgICAgIDB4NzNEQzE2ODMsIDB4RTM2MzBCMTIsIDB4OTQ2NDNCODQsIDB4MEQ2RDZBM0UsIDB4N0E2QTVBQTgsIDB4RTQwRUNGMEIsIDB4OTMwOUZGOUQsCisgICAgICAgIDB4MEEwMEFFMjcsIDB4N0QwNzlFQjEsIDB4RjAwRjkzNDQsIDB4ODcwOEEzRDIsIDB4MUUwMUYyNjgsIDB4NjkwNkMyRkUsIDB4Rjc2MjU3NUQsCisgICAgICAgIDB4ODA2NTY3Q0IsIDB4MTk2QzM2NzEsIDB4NkU2QjA2RTcsIDB4RkVENDFCNzYsIDB4ODlEMzJCRTAsIDB4MTBEQTdBNUEsIDB4NjdERDRBQ0MsCisgICAgICAgIDB4RjlCOURGNkYsIDB4OEVCRUVGRjksIDB4MTdCN0JFNDMsIDB4NjBCMDhFRDUsIDB4RDZENkEzRTgsIDB4QTFEMTkzN0UsIDB4MzhEOEMyQzQsCisgICAgICAgIDB4NEZERkYyNTIsIDB4RDFCQjY3RjEsIDB4QTZCQzU3NjcsIDB4M0ZCNTA2REQsIDB4NDhCMjM2NEIsIDB4RDgwRDJCREEsIDB4QUYwQTFCNEMsCisgICAgICAgIDB4MzYwMzRBRjYsIDB4NDEwNDdBNjAsIDB4REY2MEVGQzMsIDB4QTg2N0RGNTUsIDB4MzE2RThFRUYsIDB4NDY2OUJFNzksIDB4Q0I2MUIzOEMsCisgICAgICAgIDB4QkM2NjgzMUEsIDB4MjU2RkQyQTAsIDB4NTI2OEUyMzYsIDB4Q0MwQzc3OTUsIDB4QkIwQjQ3MDMsIDB4MjIwMjE2QjksIDB4NTUwNTI2MkYsCisgICAgICAgIDB4QzVCQTNCQkUsIDB4QjJCRDBCMjgsIDB4MkJCNDVBOTIsIDB4NUNCMzZBMDQsIDB4QzJEN0ZGQTcsIDB4QjVEMENGMzEsIDB4MkNEOTlFOEIsCisgICAgICAgIDB4NUJERUFFMUQsCisKKyAgICAgICAgMHg5QjY0QzJCMCwgMHhFQzYzRjIyNiwgMHg3NTZBQTM5QywgMHgwMjZEOTMwQSwgMHg5QzA5MDZBOSwgMHhFQjBFMzYzRiwgMHg3MjA3Njc4NSwKKyAgICAgICAgMHgwNTAwNTcxMywgMHg5NUJGNEE4MiwgMHhFMkI4N0ExNCwgMHg3QkIxMkJBRSwgMHgwQ0I2MUIzOCwgMHg5MkQyOEU5QiwgMHhFNUQ1QkUwRCwKKyAgICAgICAgMHg3Q0RDRUZCNywgMHgwQkRCREYyMSwgMHg4NkQzRDJENCwgMHhGMUQ0RTI0MiwgMHg2OEREQjNGOCwgMHgxRkRBODM2RSwgMHg4MUJFMTZDRCwKKyAgICAgICAgMHhGNkI5MjY1QiwgMHg2RkIwNzdFMSwgMHgxOEI3NDc3NywgMHg4ODA4NUFFNiwgMHhGRjBGNkE3MCwgMHg2NjA2M0JDQSwgMHgxMTAxMEI1QywKKyAgICAgICAgMHg4RjY1OUVGRiwgMHhGODYyQUU2OSwgMHg2MTZCRkZEMywgMHgxNjZDQ0Y0NSwgMHhBMDBBRTI3OCwgMHhENzBERDJFRSwgMHg0RTA0ODM1NCwKKyAgICAgICAgMHgzOTAzQjNDMiwgMHhBNzY3MjY2MSwgMHhEMDYwMTZGNywgMHg0OTY5NDc0RCwgMHgzRTZFNzdEQiwgMHhBRUQxNkE0QSwgMHhEOUQ2NUFEQywKKyAgICAgICAgMHg0MERGMEI2NiwgMHgzN0Q4M0JGMCwgMHhBOUJDQUU1MywgMHhERUJCOUVDNSwgMHg0N0IyQ0Y3RiwgMHgzMEI1RkZFOSwgMHhCREJERjIxQywKKyAgICAgICAgMHhDQUJBQzI4QSwgMHg1M0IzOTMzMCwgMHgyNEI0QTNBNiwgMHhCQUQwMzYwNSwgMHhDREQ3MDY5MywgMHg1NERFNTcyOSwgMHgyM0Q5NjdCRiwKKyAgICAgICAgMHhCMzY2N0EyRSwgMHhDNDYxNEFCOCwgMHg1RDY4MUIwMiwgMHgyQTZGMkI5NCwgMHhCNDBCQkUzNywgMHhDMzBDOEVBMSwgMHg1QTA1REYxQiwKKyAgICAgICAgMHgyRDAyRUY4RH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5fYnl0ZXM7ICsraSkgeworICAgICAgICAqY3JjIF49ICgodWludDhfdCopZGF0YSlbaV07CisgICAgICAgICpjcmMgPSB0YWJsZVsodWludDhfdCkqY3JjXSBeICpjcmMgPj4gODsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitTdGF0dXMgY3BfcmVzdG9yZUNoZWNrcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGJsb2NrRGV2aWNlKSB7CisgICAgTE9HKElORk8pIDw8ICJSZXN0b3JpbmcgY2hlY2twb2ludCBvbiAiIDw8IGJsb2NrRGV2aWNlOworICAgIHN0ZDo6ZnN0cmVhbSBkZXZpY2UoYmxvY2tEZXZpY2UsIHN0ZDo6aW9zOjpiaW5hcnkgfCBzdGQ6Omlvczo6aW4gfCBzdGQ6Omlvczo6b3V0KTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IG9wZW4gIiA8PCBibG9ja0RldmljZTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoZXJybm8sICgiQ2Fubm90IG9wZW4gIiArIGJsb2NrRGV2aWNlKS5jX3N0cigpKTsKKyAgICB9CisgICAgY2hhciBidWZmZXJba0Jsb2NrU2l6ZV07CisgICAgZGV2aWNlLnJlYWQoYnVmZmVyLCBrQmxvY2tTaXplKTsKKyAgICBsb2dfc2VjdG9yJiBscyA9ICoobG9nX3NlY3RvciopYnVmZmVyOworICAgIGlmIChscy5tYWdpYyAhPSBrTWFnaWMpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gbWFnaWMiOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJObyBtYWdpYyIpOworICAgIH0KKworICAgIExPRyhJTkZPKSA8PCAiUmVzdG9yaW5nICIgPDwgbHMuc2VxdWVuY2UgPDwgIiBsb2cgc2VjdG9ycyI7CisKKyAgICBmb3IgKGludCBzZXF1ZW5jZSA9IGxzLnNlcXVlbmNlOyBzZXF1ZW5jZSA+PSAwOyBzZXF1ZW5jZS0tKSB7CisgICAgICAgIGNoYXIgYnVmZmVyW2tCbG9ja1NpemVdOworICAgICAgICBkZXZpY2Uuc2Vla2coMCk7CisgICAgICAgIGRldmljZS5yZWFkKGJ1ZmZlciwga0Jsb2NrU2l6ZSk7CisgICAgICAgIGxvZ19zZWN0b3ImIGxzID0gKihsb2dfc2VjdG9yKilidWZmZXI7CisgICAgICAgIGlmIChscy5tYWdpYyAhPSBrTWFnaWMpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG1hZ2ljISI7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJObyBtYWdpYyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChpbnQpbHMuc2VxdWVuY2UgIT0gc2VxdWVuY2UpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkV4cGVjdGluZyBsb2cgc2VjdG9yICIgPDwgc2VxdWVuY2UgPDwgIiBidXQgZ290ICIgPDwgbHMuc2VxdWVuY2U7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSgKKyAgICAgICAgICAgICAgICBFSU5WQUwsICgiRXhwZWN0aW5nIGxvZyBzZWN0b3IgIiArIHN0ZDo6dG9fc3RyaW5nKHNlcXVlbmNlKSArICIgYnV0IGdvdCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhscy5zZXF1ZW5jZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgTE9HKElORk8pIDw8ICJSZXN0b3JpbmcgZnJvbSBsb2cgc2VjdG9yICIgPDwgbHMuc2VxdWVuY2U7CisKKyAgICAgICAgZm9yIChsb2dfZW50cnkqIGxlID0gJmxzLmVudHJpZXNbbHMuY291bnQgLSAxXTsgbGUgPj0gbHMuZW50cmllczsgLS1sZSkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJSZXN0b3JpbmcgIiA8PCBsZS0+c2l6ZSA8PCAiIGJ5dGVzIGZyb20gc2VjdG9yICIgPDwgbGUtPmRlc3QgPDwgIiB0byAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgbGUtPnNvdXJjZSA8PCAiIHdpdGggY2hlY2tzdW0gIiA8PCBzdGQ6OmhleCA8PCBsZS0+Y2hlY2tzdW07CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBidWZmZXIobGUtPnNpemUpOworICAgICAgICAgICAgZGV2aWNlLnNlZWtnKGxlLT5kZXN0ICoga1NlY3RvclNpemUpOworICAgICAgICAgICAgZGV2aWNlLnJlYWQoJmJ1ZmZlclswXSwgbGUtPnNpemUpOworCisgICAgICAgICAgICB1aW50MzJfdCBjaGVja3N1bSA9IGxlLT5zb3VyY2UgLyAoa0Jsb2NrU2l6ZSAvIGtTZWN0b3JTaXplKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGUtPnNpemU7IGkgKz0ga0Jsb2NrU2l6ZSkgeworICAgICAgICAgICAgICAgIGNyYzMyKCZidWZmZXJbaV0sIGtCbG9ja1NpemUsICZjaGVja3N1bSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZS0+Y2hlY2tzdW0gJiYgY2hlY2tzdW0gIT0gbGUtPmNoZWNrc3VtKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2hlY2tzdW1zIGRvbid0IG1hdGNoICIgPDwgc3RkOjpoZXggPDwgY2hlY2tzdW07CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoRUlOVkFMLCAiQ2hlY2tzdW1zIGRvbid0IG1hdGNoIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRldmljZS5zZWVrZyhsZS0+c291cmNlICoga1NlY3RvclNpemUpOworICAgICAgICAgICAgZGV2aWNlLndyaXRlKCZidWZmZXJbMF0sIGxlLT5zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBjcF9tYXJrQm9vdEF0dGVtcHQoKSB7CisgICAgc3RkOjpzdHJpbmcgb2xkQ29udGVudCwgbmV3Q29udGVudDsKKyAgICBpbnQgcmV0cnkgPSAwOworICAgIHN0cnVjdCBzdGF0IHN0OworICAgIGludCByZXN1bHQgPSBzdGF0KGtNZXRhZGF0YUNQRmlsZS5jX3N0cigpLCAmc3QpOworCisgICAgLy8gSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgd2UgYXJlbid0IG1hbmFnaW5nIGEgY2hlY2twb2ludCByZXRyeSBjb3VudGVyCisgICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhrTWV0YWRhdGFDUEZpbGUsICZvbGRDb250ZW50KSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgY2hlY2twb2ludCBmaWxlIjsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoZXJybm8sICJGYWlsZWQgdG8gcmVhZCBjaGVja3BvaW50IGZpbGUiKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmV0cnlDb250ZW50ID0gb2xkQ29udGVudC5zdWJzdHIoMCwgb2xkQ29udGVudC5maW5kX2ZpcnN0X29mKCIgIikpOworCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludChyZXRyeUNvbnRlbnQsICZyZXRyeSkpCisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKEVJTlZBTCwgIkNvdWxkIG5vdCBwYXJzZSByZXRyeSBjb3VudCIpOworICAgIGlmIChyZXRyeSA+IDApIHsKKyAgICAgICAgcmV0cnktLTsKKworICAgICAgICBuZXdDb250ZW50ID0gc3RkOjp0b19zdHJpbmcocmV0cnkpOworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKG5ld0NvbnRlbnQsIGtNZXRhZGF0YUNQRmlsZSkpCisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShlcnJubywgIkNvdWxkIG5vdCB3cml0ZSBjaGVja3BvaW50IGZpbGUiKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHZvbGQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9DaGVja3BvaW50LmggYi9DaGVja3BvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjMmY5NAotLS0gL2Rldi9udWxsCisrKyBiL0NoZWNrcG9pbnQuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQ0hFQ0tQT0lOVF9ICisjZGVmaW5lIF9DSEVDS1BPSU5UX0gKKworI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB2b2xkIHsKKworYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgY3Bfc3RhcnRDaGVja3BvaW50KGludCByZXRyeSk7CisKK2FuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGNwX2NvbW1pdENoYW5nZXMoKTsKKworYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgY3BfYWJvcnRDaGFuZ2VzKCk7CisKK2Jvb2wgY3BfbmVlZHNSb2xsYmFjaygpOworCitib29sIGNwX25lZWRzQ2hlY2twb2ludCgpOworCithbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBjcF9wcmVwYXJlQ2hlY2twb2ludCgpOworCithbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBjcF9yZXN0b3JlQ2hlY2twb2ludChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQb2ludCk7CisKK2FuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGNwX21hcmtCb290QXR0ZW1wdCgpOworCit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9EZXZtYXBwZXIuY3BwIGIvRGV2bWFwcGVyLmNwcAppbmRleCAyNTEwNzcxLi5iNDI0NjdjIDEwMDY0NAotLS0gYS9EZXZtYXBwZXIuY3BwCisrKyBiL0Rldm1hcHBlci5jcHAKQEAgLTE2LDIzICsxNiwyMiBAQAogCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19QQUNLQUdFX01BTkFHRVIKIAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCiAjaW5jbHVkZSAiRGV2bWFwcGVyLmgiCkBAIC00Myw4ICs0Miw3IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyKiBrVm9sZFByZWZpeCA9ICJ2b2xkOiI7CiAKLXZvaWQgRGV2bWFwcGVyOjppb2N0bEluaXQoc3RydWN0IGRtX2lvY3RsICppbywgc2l6ZV90IGRhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBmbGFncykgewordm9pZCBEZXZtYXBwZXI6OmlvY3RsSW5pdChzdHJ1Y3QgZG1faW9jdGwqIGlvLCBzaXplX3QgZGF0YVNpemUsIGNvbnN0IGNoYXIqIG5hbWUsIHVuc2lnbmVkIGZsYWdzKSB7CiAgICAgbWVtc2V0KGlvLCAwLCBkYXRhU2l6ZSk7CiAgICAgaW8tPmRhdGFfc2l6ZSA9IGRhdGFTaXplOwogICAgIGlvLT5kYXRhX3N0YXJ0ID0gc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCk7CkBAIC01NCwxNyArNTIsMTYgQEAKICAgICBpby0+ZmxhZ3MgPSBmbGFnczsKICAgICBpZiAobmFtZSkgewogICAgICAgICBzaXplX3QgcmV0ID0gc3RybGNweShpby0+bmFtZSwgbmFtZSwgc2l6ZW9mKGlvLT5uYW1lKSk7Ci0gICAgICAgIGlmIChyZXQgPj0gc2l6ZW9mKGlvLT5uYW1lKSkKLSAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIGlmIChyZXQgPj0gc2l6ZW9mKGlvLT5uYW1lKSkgYWJvcnQoKTsKICAgICB9CiB9CiAKLWludCBEZXZtYXBwZXI6OmNyZWF0ZShjb25zdCBjaGFyICpuYW1lX3JhdywgY29uc3QgY2hhciAqbG9vcEZpbGUsIGNvbnN0IGNoYXIgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsIGNoYXIgKnVidWZmZXIsIHNpemVfdCBsZW4pIHsKK2ludCBEZXZtYXBwZXI6OmNyZWF0ZShjb25zdCBjaGFyKiBuYW1lX3JhdywgY29uc3QgY2hhciogbG9vcEZpbGUsIGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsIGNoYXIqIHVidWZmZXIsIHNpemVfdCBsZW4pIHsKICAgICBhdXRvIG5hbWVfc3RyaW5nID0gU3RyaW5nUHJpbnRmKCIlcyVzIiwga1ZvbGRQcmVmaXgsIG5hbWVfcmF3KTsKICAgICBjb25zdCBjaGFyKiBuYW1lID0gbmFtZV9zdHJpbmcuY19zdHIoKTsKIAotICAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyICopIG1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOworICAgIGNoYXIqIGJ1ZmZlciA9IChjaGFyKiltYWxsb2MoREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKICAgICBpZiAoIWJ1ZmZlcikgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIG1hbGxvYyI7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTc3LDggKzc0LDggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHN0cnVjdCBkbV9pb2N0bCAqaW8gPSAoc3RydWN0IGRtX2lvY3RsICopIGJ1ZmZlcjsKLSAKKyAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopYnVmZmVyOworCiAgICAgLy8gQ3JlYXRlIHRoZSBETSBkZXZpY2UKICAgICBpb2N0bEluaXQoaW8sIERFVk1BUFBFUl9CVUZGRVJfU0laRSwgbmFtZSwgMCk7CiAKQEAgLTkyLDExICs4OSwxMSBAQAogICAgIC8vIFNldCB0aGUgbGVnYWN5IGdlb21ldHJ5CiAgICAgaW9jdGxJbml0KGlvLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUsIG5hbWUsIDApOwogCi0gICAgY2hhciAqZ2VvUGFyYW1zID0gYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCk7CisgICAgY2hhciogZ2VvUGFyYW1zID0gYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCk7CiAgICAgLy8gYnBzPTUxMiBzcGM9OCByZXM9MzIgbmZ0PTIgc2VjPTgxOTAgbWlkPTB4ZjAgc3B0PTYzIGhkcz02NCBoaWQ9MCBic3BmPTggcmRjbD0yIGluZnM9MSBia2JzPTIKICAgICBzdHJsY3B5KGdlb1BhcmFtcywgIjAgNjQgNjMgMCIsIERFVk1BUFBFUl9CVUZGRVJfU0laRSAtIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpKTsKICAgICBnZW9QYXJhbXMgKz0gc3RybGVuKGdlb1BhcmFtcykgKyAxOwotICAgIGdlb1BhcmFtcyA9IChjaGFyICopIF9hbGlnbihnZW9QYXJhbXMsIDgpOworICAgIGdlb1BhcmFtcyA9IChjaGFyKilfYWxpZ24oZ2VvUGFyYW1zLCA4KTsKICAgICBpZiAoaW9jdGwoZmQsIERNX0RFVl9TRVRfR0VPTUVUUlksIGlvKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIERNX0RFVl9TRVRfR0VPTUVUUlkiOwogICAgICAgICBmcmVlKGJ1ZmZlcik7CkBAIC0xMTcsOCArMTE0LDggQEAKICAgICBzbnByaW50Zih1YnVmZmVyLCBsZW4sICIvZGV2L2Jsb2NrL2RtLSV1IiwgbWlub3IpOwogCiAgICAgLy8gTG9hZCB0aGUgdGFibGUKLSAgICBzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgKnRndDsKLSAgICB0Z3QgPSAoc3RydWN0IGRtX3RhcmdldF9zcGVjICopICZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOworICAgIHN0cnVjdCBkbV90YXJnZXRfc3BlYyogdGd0OworICAgIHRndCA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMqKSZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOwogCiAgICAgaW9jdGxJbml0KGlvLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUsIG5hbWUsIERNX1NUQVRVU19UQUJMRV9GTEFHKTsKICAgICBpby0+dGFyZ2V0X2NvdW50ID0gMTsKQEAgLTEyOSwxMiArMTI2LDEyIEBACiAKICAgICBzdHJsY3B5KHRndC0+dGFyZ2V0X3R5cGUsICJjcnlwdCIsIHNpemVvZih0Z3QtPnRhcmdldF90eXBlKSk7CiAKLSAgICBjaGFyICpjcnlwdFBhcmFtcyA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYyk7CisgICAgY2hhciogY3J5cHRQYXJhbXMgPSBidWZmZXIgKyBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKSArIHNpemVvZihzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMpOwogICAgIHNucHJpbnRmKGNyeXB0UGFyYW1zLAotICAgICAgICAgICAgREVWTUFQUEVSX0JVRkZFUl9TSVpFIC0gKHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYykpLAotICAgICAgICAgICAgInR3b2Zpc2ggJXMgMCAlcyAwIiwga2V5LCBsb29wRmlsZSk7CisgICAgICAgICAgICAgREVWTUFQUEVSX0JVRkZFUl9TSVpFIC0gKHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYykpLAorICAgICAgICAgICAgICJ0d29maXNoICVzIDAgJXMgMCIsIGtleSwgbG9vcEZpbGUpOwogICAgIGNyeXB0UGFyYW1zICs9IHN0cmxlbihjcnlwdFBhcmFtcykgKyAxOwotICAgIGNyeXB0UGFyYW1zID0gKGNoYXIgKikgX2FsaWduKGNyeXB0UGFyYW1zLCA4KTsKKyAgICBjcnlwdFBhcmFtcyA9IChjaGFyKilfYWxpZ24oY3J5cHRQYXJhbXMsIDgpOwogICAgIHRndC0+bmV4dCA9IGNyeXB0UGFyYW1zIC0gYnVmZmVyOwogCiAgICAgaWYgKGlvY3RsKGZkLCBETV9UQUJMRV9MT0FELCBpbykpIHsKQEAgLTE2MCwxMSArMTU3LDExIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBEZXZtYXBwZXI6OmRlc3Ryb3koY29uc3QgY2hhciAqbmFtZV9yYXcpIHsKK2ludCBEZXZtYXBwZXI6OmRlc3Ryb3koY29uc3QgY2hhciogbmFtZV9yYXcpIHsKICAgICBhdXRvIG5hbWVfc3RyaW5nID0gU3RyaW5nUHJpbnRmKCIlcyVzIiwga1ZvbGRQcmVmaXgsIG5hbWVfcmF3KTsKICAgICBjb25zdCBjaGFyKiBuYW1lID0gbmFtZV9zdHJpbmcuY19zdHIoKTsKIAotICAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyICopIG1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOworICAgIGNoYXIqIGJ1ZmZlciA9IChjaGFyKiltYWxsb2MoREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKICAgICBpZiAoIWJ1ZmZlcikgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIG1hbGxvYyI7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE3Nyw4ICsxNzQsOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgc3RydWN0IGRtX2lvY3RsICppbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOwotIAorICAgIHN0cnVjdCBkbV9pb2N0bCogaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CisKICAgICAvLyBDcmVhdGUgdGhlIERNIGRldmljZQogICAgIGlvY3RsSW5pdChpbywgREVWTUFQUEVSX0JVRkZFUl9TSVpFLCBuYW1lLCAwKTsKIApAQCAtMTk4LDE0ICsxOTUsMTQgQEAKIAogaW50IERldm1hcHBlcjo6ZGVzdHJveUFsbCgpIHsKICAgICBBVFJBQ0VfTkFNRSgiRGV2bWFwcGVyOjpkZXN0cm95QWxsIik7Ci0gICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKikgbWFsbG9jKDEwMjQgKiA2NCk7CisgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKW1hbGxvYygxMDI0ICogNjQpOwogICAgIGlmICghYnVmZmVyKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgbWFsbG9jIjsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBtZW1zZXQoYnVmZmVyLCAwLCAoMTAyNCAqIDY0KSk7CiAKLSAgICBjaGFyICpidWZmZXIyID0gKGNoYXIgKikgbWFsbG9jKERFVk1BUFBFUl9CVUZGRVJfU0laRSk7CisgICAgY2hhciogYnVmZmVyMiA9IChjaGFyKiltYWxsb2MoREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKICAgICBpZiAoIWJ1ZmZlcjIpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCBtYWxsb2MiOwogICAgICAgICBmcmVlKGJ1ZmZlcik7CkBAIC0yMjAsNyArMjE3LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHN0cnVjdCBkbV9pb2N0bCAqaW8gPSAoc3RydWN0IGRtX2lvY3RsICopIGJ1ZmZlcjsKKyAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopYnVmZmVyOwogICAgIGlvY3RsSW5pdChpbywgKDEwMjQgKiA2NCksIE5VTEwsIDApOwogCiAgICAgaWYgKGlvY3RsKGZkLCBETV9MSVNUX0RFVklDRVMsIGlvKSkgewpAQCAtMjMxLDcgKzIyOCw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBzdHJ1Y3QgZG1fbmFtZV9saXN0ICpuID0gKHN0cnVjdCBkbV9uYW1lX2xpc3QgKikgKCgoY2hhciAqKSBidWZmZXIpICsgaW8tPmRhdGFfc3RhcnQpOworICAgIHN0cnVjdCBkbV9uYW1lX2xpc3QqIG4gPSAoc3RydWN0IGRtX25hbWVfbGlzdCopKCgoY2hhciopYnVmZmVyKSArIGlvLT5kYXRhX3N0YXJ0KTsKICAgICBpZiAoIW4tPmRldikgewogICAgICAgICBmcmVlKGJ1ZmZlcik7CiAgICAgICAgIGZyZWUoYnVmZmVyMik7CkBAIC0yNDEsMTMgKzIzOCwxMyBAQAogCiAgICAgdW5zaWduZWQgbnh0ID0gMDsKICAgICBkbyB7Ci0gICAgICAgIG4gPSAoc3RydWN0IGRtX25hbWVfbGlzdCAqKSAoKChjaGFyICopIG4pICsgbnh0KTsKKyAgICAgICAgbiA9IChzdHJ1Y3QgZG1fbmFtZV9saXN0KikoKChjaGFyKiluKSArIG54dCk7CiAgICAgICAgIGF1dG8gbmFtZSA9IHN0ZDo6c3RyaW5nKG4tPm5hbWUpOwogICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChuYW1lLCBrVm9sZFByZWZpeCkpIHsKICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlRlYXJpbmcgZG93biBzdGFsZSBkbSBkZXZpY2UgbmFtZWQgIiA8PCBuYW1lOwogCiAgICAgICAgICAgICBtZW1zZXQoYnVmZmVyMiwgMCwgREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKLSAgICAgICAgICAgIHN0cnVjdCBkbV9pb2N0bCAqaW8yID0gKHN0cnVjdCBkbV9pb2N0bCAqKSBidWZmZXIyOworICAgICAgICAgICAgc3RydWN0IGRtX2lvY3RsKiBpbzIgPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXIyOwogICAgICAgICAgICAgaW9jdGxJbml0KGlvMiwgREVWTUFQUEVSX0JVRkZFUl9TSVpFLCBuLT5uYW1lLCAwKTsKICAgICAgICAgICAgIGlmIChpb2N0bChmZCwgRE1fREVWX1JFTU9WRSwgaW8yKSkgewogICAgICAgICAgICAgICAgIGlmIChlcnJubyAhPSBFTlhJTykgewpAQCAtMjU1LDcgKzI1Miw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGb3VuZCB1bm1hbmFnZWQgZG0gZGV2aWNlIG5hbWVkICIgPDwgbmFtZTsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIkZvdW5kIHVubWFuYWdlZCBkbSBkZXZpY2UgbmFtZWQgIiA8PCBuYW1lOwogICAgICAgICB9CiAgICAgICAgIG54dCA9IG4tPm5leHQ7CiAgICAgfSB3aGlsZSAobnh0KTsKQEAgLTI2Niw5ICsyNjMsOCBAQAogICAgIHJldHVybiAwOwogfQogCi12b2lkICpEZXZtYXBwZXI6Ol9hbGlnbih2b2lkICpwdHIsIHVuc2lnbmVkIGludCBhKQotewotICAgICAgICB1bnNpZ25lZCBsb25nIGFnbiA9IC0tYTsKK3ZvaWQqIERldm1hcHBlcjo6X2FsaWduKHZvaWQqIHB0ciwgdW5zaWduZWQgaW50IGEpIHsKKyAgICB1bnNpZ25lZCBsb25nIGFnbiA9IC0tYTsKIAotICAgICAgICByZXR1cm4gKHZvaWQgKikgKCgodW5zaWduZWQgbG9uZykgcHRyICsgYWduKSAmIH5hZ24pOworICAgIHJldHVybiAodm9pZCopKCgodW5zaWduZWQgbG9uZylwdHIgKyBhZ24pICYgfmFnbik7CiB9CmRpZmYgLS1naXQgYS9EZXZtYXBwZXIuaCBiL0Rldm1hcHBlci5oCmluZGV4IDdiYjk3ODYuLmIxZjZkZmEgMTAwNjQ0Ci0tLSBhL0Rldm1hcHBlci5oCisrKyBiL0Rldm1hcHBlci5oCkBAIC0xNywyMCArMTcsMTkgQEAKICNpZm5kZWYgX0RFVk1BUFBFUl9ICiAjZGVmaW5lIF9ERVZNQVBQRVJfSAogCi0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogY2xhc3MgRGV2bWFwcGVyIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgaW50IGNyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpsb29wRmlsZSwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuKTsKLSAgICBzdGF0aWMgaW50IGRlc3Ryb3koY29uc3QgY2hhciAqbmFtZSk7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgaW50IGNyZWF0ZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBsb29wRmlsZSwgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuKTsKKyAgICBzdGF0aWMgaW50IGRlc3Ryb3koY29uc3QgY2hhciogbmFtZSk7CiAgICAgc3RhdGljIGludCBkZXN0cm95QWxsKCk7CiAKLXByaXZhdGU6Ci0gICAgc3RhdGljIHZvaWQgKl9hbGlnbih2b2lkICpwdHIsIHVuc2lnbmVkIGludCBhKTsKLSAgICBzdGF0aWMgdm9pZCBpb2N0bEluaXQoc3RydWN0IGRtX2lvY3RsICppbywgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgZmxhZ3MpOworICBwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkKiBfYWxpZ24odm9pZCogcHRyLCB1bnNpZ25lZCBpbnQgYSk7CisgICAgc3RhdGljIHZvaWQgaW9jdGxJbml0KHN0cnVjdCBkbV9pb2N0bCogaW8sIHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IGNoYXIqIG5hbWUsIHVuc2lnbmVkIGZsYWdzKTsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvRW5jcnlwdElucGxhY2UuY3BwIGIvRW5jcnlwdElucGxhY2UuY3BwCmluZGV4IDY0NjJkYmYuLmQ1NTliZmYgMTAwNjQ0Ci0tLSBhL0VuY3J5cHRJbnBsYWNlLmNwcAorKysgYi9FbmNyeXB0SW5wbGFjZS5jcHAKQEAgLTE2LDE2ICsxNiwxNiBAQAogCiAjaW5jbHVkZSAiRW5jcnlwdElucGxhY2UuaCIKIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NC5oPgogI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgogI2luY2x1ZGUgPGYyZnNfc3BhcnNlYmxvY2suaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIApAQCAtMzYsMTMgKzM2LDExIEBACiAjaW5jbHVkZSAiY3J5cHRmcy5oIgogCiAvLyBGSVhNRSBob3JyaWJsZSBjdXQtYW5kLXBhc3RlIGNvZGUKLXN0YXRpYyBpbmxpbmUgaW50IHVuaXhfcmVhZChpbnQgIGZkLCB2b2lkKiAgYnVmZiwgaW50ICBsZW4pCi17CitzdGF0aWMgaW5saW5lIGludCB1bml4X3JlYWQoaW50IGZkLCB2b2lkKiBidWZmLCBpbnQgbGVuKSB7CiAgICAgcmV0dXJuIFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCBidWZmLCBsZW4pKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdW5peF93cml0ZShpbnQgIGZkLCBjb25zdCB2b2lkKiAgYnVmZiwgaW50ICBsZW4pCi17CitzdGF0aWMgaW5saW5lIGludCB1bml4X3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogYnVmZiwgaW50IGxlbikgewogICAgIHJldHVybiBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoZmQsIGJ1ZmYsIGxlbikpOwogfQogCkBAIC01NywxNSArNTUsMTQgQEAKICNkZWZpbmUgQkxPQ0tTX0FUX0FfVElNRSAxMDI0CiAjZW5kaWYKIAotc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhCi17CitzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgewogICAgIGludCByZWFsZmQ7CiAgICAgaW50IGNyeXB0b2ZkOwogICAgIG9mZjY0X3QgbnVtYmxvY2tzOwogICAgIG9mZjY0X3Qgb25lX3BjdCwgY3VyX3BjdCwgbmV3X3BjdDsKICAgICBvZmY2NF90IGJsb2Nrc19hbHJlYWR5X2RvbmUsIHRvdF9udW1ibG9ja3M7CiAgICAgb2ZmNjRfdCB1c2VkX2Jsb2Nrc19hbHJlYWR5X2RvbmUsIHRvdF91c2VkX2Jsb2NrczsKLSAgICBjaGFyKiByZWFsX2Jsa2RldiwgKiBjcnlwdG9fYmxrZGV2OworICAgIGNoYXIgKnJlYWxfYmxrZGV2LCAqY3J5cHRvX2Jsa2RldjsKICAgICBpbnQgY291bnQ7CiAgICAgb2ZmNjRfdCBvZmZzZXQ7CiAgICAgY2hhciogYnVmZmVyOwpAQCAtNzYsOCArNzMsNyBAQAogICAgIGJvb2wgc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXM7CiB9OwogCi1zdGF0aWMgdm9pZCB1cGRhdGVfcHJvZ3Jlc3Moc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKiBkYXRhLCBpbnQgaXNfdXNlZCkKLXsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9wcm9ncmVzcyhzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqIGRhdGEsIGludCBpc191c2VkKSB7CiAgICAgZGF0YS0+YmxvY2tzX2FscmVhZHlfZG9uZSsrOwogCiAgICAgaWYgKGlzX3VzZWQpIHsKQEAgLTEwNCwxNiArMTAwLDE0IEBACiAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkVycm9yIGdldHRpbmcgdGltZSI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkb3VibGUgZWxhcHNlZF90aW1lID0gZGlmZnRpbWUodGltZV9ub3cudHZfc2VjLCBkYXRhLT50aW1lX3N0YXJ0ZWQpOwotICAgICAgICAgICAgb2ZmNjRfdCByZW1haW5pbmdfYmxvY2tzID0gZGF0YS0+dG90X3VzZWRfYmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGRhdGEtPnVzZWRfYmxvY2tzX2FscmVhZHlfZG9uZTsKLSAgICAgICAgICAgIGludCByZW1haW5pbmdfdGltZSA9IChpbnQpKGVsYXBzZWRfdGltZSAqIHJlbWFpbmluZ19ibG9ja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gZGF0YS0+dXNlZF9ibG9ja3NfYWxyZWFkeV9kb25lKTsKKyAgICAgICAgICAgIG9mZjY0X3QgcmVtYWluaW5nX2Jsb2NrcyA9IGRhdGEtPnRvdF91c2VkX2Jsb2NrcyAtIGRhdGEtPnVzZWRfYmxvY2tzX2FscmVhZHlfZG9uZTsKKyAgICAgICAgICAgIGludCByZW1haW5pbmdfdGltZSA9CisgICAgICAgICAgICAgICAgKGludCkoZWxhcHNlZF90aW1lICogcmVtYWluaW5nX2Jsb2NrcyAvIGRhdGEtPnVzZWRfYmxvY2tzX2FscmVhZHlfZG9uZSk7CiAKICAgICAgICAgICAgIC8vIENoYW5nZSB0aW1lIG9ubHkgaWYgbm90IHlldCBzZXQsIGxvd2VyLCBvciBhIGxvdCBoaWdoZXIgZm9yCiAgICAgICAgICAgICAvLyBiZXN0IHVzZXIgZXhwZXJpZW5jZQotICAgICAgICAgICAgaWYgKGRhdGEtPnJlbWFpbmluZ190aW1lID09IC0xCi0gICAgICAgICAgICAgICAgfHwgcmVtYWluaW5nX3RpbWUgPCBkYXRhLT5yZW1haW5pbmdfdGltZQotICAgICAgICAgICAgICAgIHx8IHJlbWFpbmluZ190aW1lID4gZGF0YS0+cmVtYWluaW5nX3RpbWUgKyA2MCkgeworICAgICAgICAgICAgaWYgKGRhdGEtPnJlbWFpbmluZ190aW1lID09IC0xIHx8IHJlbWFpbmluZ190aW1lIDwgZGF0YS0+cmVtYWluaW5nX3RpbWUgfHwKKyAgICAgICAgICAgICAgICByZW1haW5pbmdfdGltZSA+IGRhdGEtPnJlbWFpbmluZ190aW1lICsgNjApIHsKICAgICAgICAgICAgICAgICBjaGFyIGJ1Zls4XTsKICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCByZW1haW5pbmdfdGltZSk7CiAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoInZvbGQuZW5jcnlwdF90aW1lX3JlbWFpbmluZyIsIGJ1Zik7CkBAIC0xMjMsOCArMTE3LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGxvZ19wcm9ncmVzcyhzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgY29uc3QqIGRhdGEsIGJvb2wgY29tcGxldGVkKQoteworc3RhdGljIHZvaWQgbG9nX3Byb2dyZXNzKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSBjb25zdCogZGF0YSwgYm9vbCBjb21wbGV0ZWQpIHsKICAgICAvLyBQcmVjb25kaXRpb24gLSBpZiBjb21wbGV0ZWQgZGF0YSA9IDAgZWxzZSBkYXRhICE9IDAKIAogICAgIC8vIFRyYWNrIHByb2dyZXNzIHNvIHdlIGNhbiBza2lwIGxvZ2dpbmcgYmxvY2tzCkBAIC0xNDcsMTMgKzE0MCwxMiBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCBmbHVzaF9vdXRzdGFuZGluZ19kYXRhKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogZGF0YSkKLXsKK3N0YXRpYyBpbnQgZmx1c2hfb3V0c3RhbmRpbmdfZGF0YShzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqIGRhdGEpIHsKICAgICBpZiAoZGF0YS0+Y291bnQgPT0gMCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBMT0coVkVSQk9TRSkgPDwgIkNvcHlpbmcgIiA8PCBkYXRhLT5jb3VudCA8PCAiIGJsb2NrcyBhdCBvZmZzZXQgIiA8PCBkYXRhLT5vZmZzZXQ7CisgICAgTE9HKERFQlVHKSA8PCAiQ29weWluZyAiIDw8IGRhdGEtPmNvdW50IDw8ICIgYmxvY2tzIGF0IG9mZnNldCAiIDw8IGRhdGEtPm9mZnNldDsKIAogICAgIGlmIChwcmVhZDY0KGRhdGEtPnJlYWxmZCwgZGF0YS0+YnVmZmVyLCBpbmZvLmJsb2NrX3NpemUgKiBkYXRhLT5jb3VudCwgZGF0YS0+b2Zmc2V0KSA8PSAwKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yIHJlYWRpbmcgcmVhbF9ibGtkZXYgIiA8PCBkYXRhLT5yZWFsX2Jsa2RldiA8PCAiIGZvciBpbnBsYWNlIGVuY3J5cHQiOwpAQCAtMTY1LDMwICsxNTcsMjkgQEAKICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBpbnBsYWNlIGVuY3J5cHQiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIHsKLSAgICAgIGxvZ19wcm9ncmVzcyhkYXRhLCBmYWxzZSk7CisgICAgICAgIGxvZ19wcm9ncmVzcyhkYXRhLCBmYWxzZSk7CiAgICAgfQogCiAgICAgZGF0YS0+Y291bnQgPSAwOwotICAgIGRhdGEtPmxhc3Rfd3JpdHRlbl9zZWN0b3IgPSAoZGF0YS0+b2Zmc2V0ICsgZGF0YS0+Y291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gaW5mby5ibG9ja19zaXplICogQ1JZUFRfU0VDVE9SX1NJWkUgLSAxOworICAgIGRhdGEtPmxhc3Rfd3JpdHRlbl9zZWN0b3IgPQorICAgICAgICAoZGF0YS0+b2Zmc2V0ICsgZGF0YS0+Y291bnQpIC8gaW5mby5ibG9ja19zaXplICogQ1JZUFRfU0VDVE9SX1NJWkUgLSAxOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVuY3J5cHRfZ3JvdXBzKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogZGF0YSkKLXsKK3N0YXRpYyBpbnQgZW5jcnlwdF9ncm91cHMoc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKiBkYXRhKSB7CiAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgdTggKmJsb2NrX2JpdG1hcCA9IDA7CisgICAgdTgqIGJsb2NrX2JpdG1hcCA9IDA7CiAgICAgdW5zaWduZWQgaW50IGJsb2NrOwogICAgIG9mZjY0X3QgcmV0OwogICAgIGludCByYyA9IC0xOwogCi0gICAgZGF0YS0+YnVmZmVyID0gKGNoYXIqKSBtYWxsb2MoaW5mby5ibG9ja19zaXplICogQkxPQ0tTX0FUX0FfVElNRSk7CisgICAgZGF0YS0+YnVmZmVyID0gKGNoYXIqKW1hbGxvYyhpbmZvLmJsb2NrX3NpemUgKiBCTE9DS1NfQVRfQV9USU1FKTsKICAgICBpZiAoIWRhdGEtPmJ1ZmZlcikgewogICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgY3J5cHRvIGJ1ZmZlciI7CiAgICAgICAgIGdvdG8gZXJyb3V0OwogICAgIH0KIAotICAgIGJsb2NrX2JpdG1hcCA9ICh1OCopIG1hbGxvYyhpbmZvLmJsb2NrX3NpemUpOworICAgIGJsb2NrX2JpdG1hcCA9ICh1OCopbWFsbG9jKGluZm8uYmxvY2tfc2l6ZSk7CiAgICAgaWYgKCFibG9ja19iaXRtYXApIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIGFsbG9jYXRlIGJsb2NrIGJpdG1hcCI7CiAgICAgICAgIGdvdG8gZXJyb3V0OwpAQCAtMTk4LDExICsxODksOSBAQAogICAgICAgICBMT0coSU5GTykgPDwgIkVuY3J5cHRpbmcgZ3JvdXAgIiA8PCBpOwogCiAgICAgICAgIHUzMiBmaXJzdF9ibG9jayA9IGF1eF9pbmZvLmZpcnN0X2RhdGFfYmxvY2sgKyBpICogaW5mby5ibG9ja3NfcGVyX2dyb3VwOwotICAgICAgICB1MzIgYmxvY2tfY291bnQgPSBzdGQ6Om1pbihpbmZvLmJsb2Nrc19wZXJfZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKGF1eF9pbmZvLmxlbl9ibG9ja3MgLSBmaXJzdF9ibG9jaykpOworICAgICAgICB1MzIgYmxvY2tfY291bnQgPSBzdGQ6Om1pbihpbmZvLmJsb2Nrc19wZXJfZ3JvdXAsICh1MzIpKGF1eF9pbmZvLmxlbl9ibG9ja3MgLSBmaXJzdF9ibG9jaykpOwogCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKHU2NClpbmZvLmJsb2NrX3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwOworICAgICAgICBvZmY2NF90IG9mZnNldCA9ICh1NjQpaW5mby5ibG9ja19zaXplICogYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXA7CiAKICAgICAgICAgcmV0ID0gcHJlYWQ2NChkYXRhLT5yZWFsZmQsIGJsb2NrX2JpdG1hcCwgaW5mby5ibG9ja19zaXplLCBvZmZzZXQpOwogICAgICAgICBpZiAocmV0ICE9IChpbnQpaW5mby5ibG9ja19zaXplKSB7CkBAIC0yMTUsOCArMjA0LDkgQEAKICAgICAgICAgZGF0YS0+Y291bnQgPSAwOwogCiAgICAgICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IGJsb2NrX2NvdW50OyBibG9jaysrKSB7Ci0gICAgICAgICAgICBpbnQgdXNlZCA9IChhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZsYWdzICYgRVhUNF9CR19CTE9DS19VTklOSVQpID8KLSAgICAgICAgICAgICAgICAgICAgMCA6IGJpdG1hcF9nZXRfYml0KGJsb2NrX2JpdG1hcCwgYmxvY2spOworICAgICAgICAgICAgaW50IHVzZWQgPSAoYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19mbGFncyAmIEVYVDRfQkdfQkxPQ0tfVU5JTklUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJpdG1hcF9nZXRfYml0KGJsb2NrX2JpdG1hcCwgYmxvY2spOwogICAgICAgICAgICAgdXBkYXRlX3Byb2dyZXNzKGRhdGEsIHVzZWQpOwogICAgICAgICAgICAgaWYgKHVzZWQpIHsKICAgICAgICAgICAgICAgICBpZiAoZGF0YS0+Y291bnQgPT0gMCkgewpAQCAtMjMyLDggKzIyMiw4IEBACiAgICAgICAgICAgICBvZmZzZXQgKz0gaW5mby5ibG9ja19zaXplOwogCiAgICAgICAgICAgICAvKiBXcml0ZSBkYXRhIGlmIHdlIGFyZSBhbGlnbmVkIG9yIGJ1ZmZlciBzaXplIHJlYWNoZWQgKi8KLSAgICAgICAgICAgIGlmIChvZmZzZXQgJSAoaW5mby5ibG9ja19zaXplICogQkxPQ0tTX0FUX0FfVElNRSkgPT0gMAotICAgICAgICAgICAgICAgIHx8IGRhdGEtPmNvdW50ID09IEJMT0NLU19BVF9BX1RJTUUpIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgJSAoaW5mby5ibG9ja19zaXplICogQkxPQ0tTX0FUX0FfVElNRSkgPT0gMCB8fAorICAgICAgICAgICAgICAgIGRhdGEtPmNvdW50ID09IEJMT0NLU19BVF9BX1RJTUUpIHsKICAgICAgICAgICAgICAgICBpZiAoZmx1c2hfb3V0c3RhbmRpbmdfZGF0YShkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm91dDsKICAgICAgICAgICAgICAgICB9CkBAIC0yNjAsNyArMjUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXMpIHsKICAgICB1MzIgaTsKICAgICBzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgZGF0YTsKLSAgICBpbnQgcmM7IC8vIENhbid0IGluaXRpYWxpemUgd2l0aG91dCBjYXVzaW5nIHdhcm5pbmcgLVdjbG9iYmVyZWQKKyAgICBpbnQgcmM7ICAvLyBDYW4ndCBpbml0aWFsaXplIHdpdGhvdXQgY2F1c2luZyB3YXJuaW5nIC1XY2xvYmJlcmVkCiAgICAgaW50IHJldHJpZXMgPSBSRVRSWV9NT1VOVF9BVFRFTVBUUzsKICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZV9zdGFydGVkID0gezB9OwogCkBAIC0yNzUsNyArMjY1LDcgQEAKICAgICBkYXRhLnNldF9wcm9ncmVzc19wcm9wZXJ0aWVzID0gc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXM7CiAKICAgICBMT0coREVCVUcpIDw8ICJPcGVuaW5nIiA8PCByZWFsX2Jsa2RldjsKLSAgICBpZiAoIChkYXRhLnJlYWxmZCA9IG9wZW4ocmVhbF9ibGtkZXYsIE9fUkRXUnxPX0NMT0VYRUMpKSA8IDApIHsKKyAgICBpZiAoKGRhdGEucmVhbGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRFdSIHwgT19DTE9FWEVDKSkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciBvcGVuaW5nIHJlYWxfYmxrZGV2ICIgPDwgcmVhbF9ibGtkZXYgPDwgIiBmb3IgaW5wbGFjZSBlbmNyeXB0IjsKICAgICAgICAgcmMgPSAtMTsKICAgICAgICAgZ290byBlcnJvdXQ7CkBAIC0yODMsNyArMjczLDcgQEAKIAogICAgIExPRyhERUJVRykgPDwgIk9wZW5pbmciIDw8IGNyeXB0b19ibGtkZXY7CiAgICAgLy8gV2FpdCB1bnRpbCB0aGUgYmxvY2sgZGV2aWNlIGFwcGVhcnMuICBSZS11c2UgdGhlIG1vdW50IHJldHJ5IHZhbHVlcyBzaW5jZSBpdCBpcyByZWFzb25hYmxlLgotICAgIHdoaWxlICgoZGF0YS5jcnlwdG9mZCA9IG9wZW4oY3J5cHRvX2Jsa2RldiwgT19XUk9OTFl8T19DTE9FWEVDKSkgPCAwKSB7CisgICAgd2hpbGUgKChkYXRhLmNyeXB0b2ZkID0gb3BlbihjcnlwdG9fYmxrZGV2LCBPX1dST05MWSB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBpZiAoLS1yZXRyaWVzKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3Igb3BlbmluZyBjcnlwdG9fYmxrZGV2ICIgPDwgY3J5cHRvX2Jsa2RldgogICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgZXh0NCBpbnBsYWNlIGVuY3J5cHQsIHJldHJ5aW5nIjsKQEAgLTI5Niw3ICsyODYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHNldGptcChzZXRqbXBfZW52KSkgeyAvLyBOT0xJTlQKKyAgICBpZiAoc2V0am1wKHNldGptcF9lbnYpKSB7ICAvLyBOT0xJTlQKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVhZGluZyBleHQ0IGV4dGVudCBjYXVzZWQgYW4gZXhjZXB0aW9uIjsKICAgICAgICAgcmMgPSAtMTsKICAgICAgICAgZ290byBlcnJvdXQ7CkBAIC0zMTYsNyArMzA2LDcgQEAKIAogICAgIGRhdGEudG90X3VzZWRfYmxvY2tzID0gZGF0YS5udW1ibG9ja3M7CiAgICAgZm9yIChpID0gMDsgaSA8IGF1eF9pbmZvLmdyb3VwczsgKytpKSB7Ci0gICAgICBkYXRhLnRvdF91c2VkX2Jsb2NrcyAtPSBhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZyZWVfYmxvY2tzX2NvdW50OworICAgICAgICBkYXRhLnRvdF91c2VkX2Jsb2NrcyAtPSBhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZyZWVfYmxvY2tzX2NvdW50OwogICAgIH0KIAogICAgIGRhdGEub25lX3BjdCA9IGRhdGEudG90X3VzZWRfYmxvY2tzIC8gMTAwOwpAQCAtMzQ1LDggKzMzNSw3IEBACiAgICAgcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBsb2dfcHJvZ3Jlc3NfZjJmcyh1NjQgYmxvY2ssIGJvb2wgY29tcGxldGVkKQoteworc3RhdGljIHZvaWQgbG9nX3Byb2dyZXNzX2YyZnModTY0IGJsb2NrLCBib29sIGNvbXBsZXRlZCkgewogICAgIC8vIFByZWNvbmRpdGlvbiAtIGlmIGNvbXBsZXRlZCBkYXRhID0gMCBlbHNlIGRhdGEgIT0gMAogCiAgICAgLy8gVHJhY2sgcHJvZ3Jlc3Mgc28gd2UgY2FuIHNraXAgbG9nZ2luZyBibG9ja3MKQEAgLTM2OSw5ICszNTgsOCBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCBlbmNyeXB0X29uZV9ibG9ja19mMmZzKHU2NCBwb3MsIHZvaWQgKmRhdGEpCi17Ci0gICAgc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhICpwcml2X2RhdCA9IChzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgKilkYXRhOworc3RhdGljIGludCBlbmNyeXB0X29uZV9ibG9ja19mMmZzKHU2NCBwb3MsIHZvaWQqIGRhdGEpIHsKKyAgICBzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqIHByaXZfZGF0ID0gKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSopZGF0YTsKIAogICAgIHByaXZfZGF0LT5ibG9ja3NfYWxyZWFkeV9kb25lID0gcG9zIC0gMTsKICAgICB1cGRhdGVfcHJvZ3Jlc3MocHJpdl9kYXQsIDEpOwpAQCAtNDAwLDcgKzM4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IHByZXZpb3VzbHlfZW5jcnlwdGVkX3VwdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldF9wcm9ncmVzc19wcm9wZXJ0aWVzKSB7CiAgICAgc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhIGRhdGE7Ci0gICAgc3RydWN0IGYyZnNfaW5mbyAqZjJmc19pbmZvID0gTlVMTDsKKyAgICBzdHJ1Y3QgZjJmc19pbmZvKiBmMmZzX2luZm8gPSBOVUxMOwogICAgIGludCByYyA9IEVOQUJMRV9JTlBMQUNFX0VSUl9PVEhFUjsKICAgICBpZiAocHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0byA+ICpzaXplX2FscmVhZHlfZG9uZSkgewogICAgICAgICBMT0coREVCVUcpIDw8ICJOb3QgZmFzdCBlbmNyeXB0aW5nIHNpbmNlIHJlc3VtaW5nIHBhcnQgd2F5IHRocm91Z2giOwpAQCAtNDEyLDExICs0MDAsMTEgQEAKICAgICBkYXRhLnNldF9wcm9ncmVzc19wcm9wZXJ0aWVzID0gc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXM7CiAgICAgZGF0YS5yZWFsZmQgPSAtMTsKICAgICBkYXRhLmNyeXB0b2ZkID0gLTE7Ci0gICAgaWYgKCAoZGF0YS5yZWFsZmQgPSBvcGVuNjQocmVhbF9ibGtkZXYsIE9fUkRXUnxPX0NMT0VYRUMpKSA8IDApIHsKKyAgICBpZiAoKGRhdGEucmVhbGZkID0gb3BlbjY0KHJlYWxfYmxrZGV2LCBPX1JEV1IgfCBPX0NMT0VYRUMpKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkVycm9yIG9wZW5pbmcgcmVhbF9ibGtkZXYgIiA8PCByZWFsX2Jsa2RldiA8PCAiIGZvciBmMmZzIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIGdvdG8gZXJyb3V0OwogICAgIH0KLSAgICBpZiAoIChkYXRhLmNyeXB0b2ZkID0gb3BlbjY0KGNyeXB0b19ibGtkZXYsIE9fV1JPTkxZfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIGlmICgoZGF0YS5jcnlwdG9mZCA9IG9wZW42NChjcnlwdG9fYmxrZGV2LCBPX1dST05MWSB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3Igb3BlbmluZyBjcnlwdG9fYmxrZGV2ICIgPDwgY3J5cHRvX2Jsa2RldgogICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBmMmZzIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIHJjID0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVjsKQEAgLTQyNCw4ICs0MTIsNyBAQAogICAgIH0KIAogICAgIGYyZnNfaW5mbyA9IGdlbmVyYXRlX2YyZnNfaW5mbyhkYXRhLnJlYWxmZCk7Ci0gICAgaWYgKCFmMmZzX2luZm8pCi0gICAgICBnb3RvIGVycm91dDsKKyAgICBpZiAoIWYyZnNfaW5mbykgZ290byBlcnJvdXQ7CiAKICAgICBkYXRhLm51bWJsb2NrcyA9IHNpemUgLyBDUllQVF9TRUNUT1JTX1BFUl9CVUZTSVpFOwogICAgIGRhdGEudG90X251bWJsb2NrcyA9IHRvdF9zaXplIC8gQ1JZUFRfU0VDVE9SU19QRVJfQlVGU0laRTsKQEAgLTQzOCw3ICs0MjUsNyBAQAogICAgIGRhdGEudGltZV9zdGFydGVkID0gdGltZShOVUxMKTsKICAgICBkYXRhLnJlbWFpbmluZ190aW1lID0gLTE7CiAKLSAgICBkYXRhLmJ1ZmZlciA9IChjaGFyKikgbWFsbG9jKGYyZnNfaW5mby0+YmxvY2tfc2l6ZSk7CisgICAgZGF0YS5idWZmZXIgPSAoY2hhciopbWFsbG9jKGYyZnNfaW5mby0+YmxvY2tfc2l6ZSk7CiAgICAgaWYgKCFkYXRhLmJ1ZmZlcikgewogICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgY3J5cHRvIGJ1ZmZlciI7CiAgICAgICAgIGdvdG8gZXJyb3V0OwpAQCAtNDc1LDE4ICs0NjIsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgcHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXMpIHsKICAgICBpbnQgcmVhbGZkLCBjcnlwdG9mZDsKLSAgICBjaGFyICpidWZbQ1JZUFRfSU5QTEFDRV9CVUZTSVpFXTsKKyAgICBjaGFyKiBidWZbQ1JZUFRfSU5QTEFDRV9CVUZTSVpFXTsKICAgICBpbnQgcmMgPSBFTkFCTEVfSU5QTEFDRV9FUlJfT1RIRVI7CiAgICAgb2ZmNjRfdCBudW1ibG9ja3MsIGksIHJlbWFpbmRlcjsKICAgICBvZmY2NF90IG9uZV9wY3QsIGN1cl9wY3QsIG5ld19wY3Q7CiAgICAgb2ZmNjRfdCBibG9ja3NfYWxyZWFkeV9kb25lLCB0b3RfbnVtYmxvY2tzOwogCi0gICAgaWYgKCAocmVhbGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRE9OTFl8T19DTE9FWEVDKSkgPCAwKSB7CisgICAgaWYgKChyZWFsZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JET05MWSB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3Igb3BlbmluZyByZWFsX2Jsa2RldiAiIDw8IHJlYWxfYmxrZGV2IDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIHJldHVybiBFTkFCTEVfSU5QTEFDRV9FUlJfT1RIRVI7CiAgICAgfQogCi0gICAgaWYgKCAoY3J5cHRvZmQgPSBvcGVuKGNyeXB0b19ibGtkZXYsIE9fV1JPTkxZfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIGlmICgoY3J5cHRvZmQgPSBvcGVuKGNyeXB0b19ibGtkZXYsIE9fV1JPTkxZIHwgT19DTE9FWEVDKSkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciBvcGVuaW5nIGNyeXB0b19ibGtkZXYgIiA8PCBjcnlwdG9fYmxrZGV2IDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIGNsb3NlKHJlYWxmZCk7CiAgICAgICAgIHJldHVybiBFTkFCTEVfSU5QTEFDRV9FUlJfREVWOwpAQCAtNTE2LDcgKzUwMyw3IEBACiAgICAgICAgIGdvdG8gZXJyb3V0OwogICAgIH0KIAotICAgIGZvciAoO2kgPCBzaXplICYmIGkgJSBDUllQVF9TRUNUT1JTX1BFUl9CVUZTSVpFICE9IDA7ICsraSkgeworICAgIGZvciAoOyBpIDwgc2l6ZSAmJiBpICUgQ1JZUFRfU0VDVE9SU19QRVJfQlVGU0laRSAhPSAwOyArK2kpIHsKICAgICAgICAgaWYgKHVuaXhfcmVhZChyZWFsZmQsIGJ1ZiwgQ1JZUFRfU0VDVE9SX1NJWkUpIDw9IDApIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIGluaXRpYWwgc2VjdG9ycyBmcm9tIHJlYWxfYmxrZGV2ICIgPDwgcmVhbF9ibGtkZXYKICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CkBAIC01MzQsNyArNTIxLDcgQEAKICAgICBvbmVfcGN0ID0gdG90X251bWJsb2NrcyAvIDEwMDsKICAgICBjdXJfcGN0ID0gMDsKICAgICAvKiBwcm9jZXNzIHRoZSBtYWpvcml0eSBvZiB0aGUgZmlsZXN5c3RlbSBpbiBibG9ja3MgKi8KLSAgICBmb3IgKGkvPUNSWVBUX1NFQ1RPUlNfUEVSX0JVRlNJWkU7IGk8bnVtYmxvY2tzOyBpKyspIHsKKyAgICBmb3IgKGkgLz0gQ1JZUFRfU0VDVE9SU19QRVJfQlVGU0laRTsgaSA8IG51bWJsb2NrczsgaSsrKSB7CiAgICAgICAgIG5ld19wY3QgPSAoaSArIGJsb2Nrc19hbHJlYWR5X2RvbmUpIC8gb25lX3BjdDsKICAgICAgICAgaWYgKHNldF9wcm9ncmVzc19wcm9wZXJ0aWVzICYmIG5ld19wY3QgPiBjdXJfcGN0KSB7CiAgICAgICAgICAgICBjaGFyIGJ1Zls4XTsKQEAgLTU1Nyw3ICs1NDQsNyBAQAogICAgIH0KIAogICAgIC8qIERvIGFueSByZW1haW5pbmcgc2VjdG9ycyAqLwotICAgIGZvciAoaT0wOyBpPHJlbWFpbmRlcjsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHJlbWFpbmRlcjsgaSsrKSB7CiAgICAgICAgIGlmICh1bml4X3JlYWQocmVhbGZkLCBidWYsIENSWVBUX1NFQ1RPUl9TSVpFKSA8PSAwKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIGZpbmFsIHNlY3RvcnMgZnJvbSByZWFsX2Jsa2RldiAiIDw8IHJlYWxfYmxrZGV2CiAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CkBAIC02MjYsOSArNjEzLDggQEAKICAgICBMT0coREVCVUcpIDw8ICJjcnlwdGZzX2VuYWJsZV9pbnBsYWNlX2Z1bGwoKT0iIDw8IHJjX2Z1bGw7CiAKICAgICAvKiBIYWNrIGZvciBiLzE3ODk4OTYyLCB0aGUgZm9sbG93aW5nIGlzIHRoZSBzeW1wdG9tLi4uICovCi0gICAgaWYgKHJjX2V4dDQgPT0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVgotICAgICAgICAmJiByY19mMmZzID09IEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYKLSAgICAgICAgJiYgcmNfZnVsbCA9PSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWKSB7CisgICAgaWYgKHJjX2V4dDQgPT0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFViAmJiByY19mMmZzID09IEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYgJiYKKyAgICAgICAgcmNfZnVsbCA9PSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWKSB7CiAgICAgICAgIExPRyhERUJVRykgPDwgIkVOQUJMRV9JTlBMQUNFX0VSUl9ERVYiOwogICAgICAgICByZXR1cm4gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVjsKICAgICB9CmRpZmYgLS1naXQgYS9GaWxlRGV2aWNlVXRpbHMuY3BwIGIvRmlsZURldmljZVV0aWxzLmNwcAppbmRleCBiYzlmNGJkLi5jZTkzOGE5IDEwMDY0NAotLS0gYS9GaWxlRGV2aWNlVXRpbHMuY3BwCisrKyBiL0ZpbGVEZXZpY2VVdGlscy5jcHAKQEAgLTE2LDE1ICsxNiwxNSBAQAogCiAjaW5jbHVkZSAiRmlsZURldmljZVV0aWxzLmgiCiAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZmllbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxtbnRlbnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmllbWFwLmg+Ci0jaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CkBAIC00MCwzOCArNDAsMzMgQEAKIG5hbWVzcGFjZSB2b2xkIHsKIAogLy8gR2l2ZW4gYSBmaWxlIHBhdGgsIGxvb2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGRldmljZSBpbiAvcHJvYy9tb3VudAotc3RkOjpzdHJpbmcgQmxvY2tEZXZpY2VGb3JQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKQotewotICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBpbnQoKikoRklMRSopPiBtbnRzKHNldG1udGVudCgiL3Byb2MvbW91bnRzIiwgInJlIiksIGVuZG1udGVudCk7CitzdGQ6OnN0cmluZyBCbG9ja0RldmljZUZvclBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgaW50ICgqKShGSUxFKik+IG1udHMoc2V0bW50ZW50KCIvcHJvYy9tb3VudHMiLCAicmUiKSwgZW5kbW50ZW50KTsKICAgICBpZiAoIW1udHMpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBvcGVuIC9wcm9jL21vdW50cyI7CiAgICAgICAgIHJldHVybiAiIjsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogICAgIHNpemVfdCBiZXN0X2xlbmd0aCA9IDA7Ci0gICAgc3RydWN0IG1udGVudCAqbW50OyAvLyBnZXRtbnRlbnQgcmV0dXJucyBhIHRocmVhZCBsb2NhbCwgc28gaXQncyBzYWZlLgorICAgIHN0cnVjdCBtbnRlbnQqIG1udDsgIC8vIGdldG1udGVudCByZXR1cm5zIGEgdGhyZWFkIGxvY2FsLCBzbyBpdCdzIHNhZmUuCiAgICAgd2hpbGUgKChtbnQgPSBnZXRtbnRlbnQobW50cy5nZXQoKSkpICE9IG51bGxwdHIpIHsKICAgICAgICAgYXV0byBsID0gc3RybGVuKG1udC0+bW50X2Rpcik7Ci0gICAgICAgIGlmIChsID4gYmVzdF9sZW5ndGggJiYKLSAgICAgICAgICAgIHBhdGguc2l6ZSgpID4gbCAmJgotICAgICAgICAgICAgcGF0aFtsXSA9PSAnLycgJiYKKyAgICAgICAgaWYgKGwgPiBiZXN0X2xlbmd0aCAmJiBwYXRoLnNpemUoKSA+IGwgJiYgcGF0aFtsXSA9PSAnLycgJiYKICAgICAgICAgICAgIHBhdGguY29tcGFyZSgwLCBsLCBtbnQtPm1udF9kaXIpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBtbnQtPm1udF9mc25hbWU7Ci0gICAgICAgICAgICAgICAgYmVzdF9sZW5ndGggPSBsOworICAgICAgICAgICAgcmVzdWx0ID0gbW50LT5tbnRfZnNuYW1lOworICAgICAgICAgICAgYmVzdF9sZW5ndGggPSBsOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXN1bHQuZW1wdHkoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IkRpZG4ndCBmaW5kIGEgbW91bnRwb2ludCB0byBtYXRjaCBwYXRoICIgPDwgcGF0aDsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGlkbid0IGZpbmQgYSBtb3VudHBvaW50IHRvIG1hdGNoIHBhdGggIiA8PCBwYXRoOwogICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogICAgIExPRyhERUJVRykgPDwgIkZvciBwYXRoICIgPDwgcGF0aCA8PCAiIGJsb2NrIGRldmljZSBpcyAiIDw8IHJlc3VsdDsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gUGF0aEZpZW1hcChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwgdWludDMyX3QgZXh0ZW50X2NvdW50KQotewotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbigKLSAgICAgICAgcGF0aC5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQywgMCkpKTsKK3N0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiBQYXRoRmllbWFwKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50MzJfdCBleHRlbnRfY291bnQpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGF0aC5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQywgMCkpKTsKICAgICBpZiAoZmQgPT0gLTEpIHsKICAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCkgewogICAgICAgICAgICAgUExPRyhERUJVRykgPDwgIlVuYWJsZSB0byBvcGVuICIgPDwgcGF0aDsKQEAgLTg4LDcgKzgzLDcgQEAKICAgICBhdXRvIG1hcHBlZCA9IGZpZW1hcC0+Zm1fbWFwcGVkX2V4dGVudHM7CiAgICAgaWYgKG1hcHBlZCA8IDEgfHwgbWFwcGVkID4gZXh0ZW50X2NvdW50KSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkV4dGVudCBjb3VudCBub3QgaW4gYm91bmRzIDEgPD0gIiA8PCBtYXBwZWQgPDwgIiA8PSAiIDw8IGV4dGVudF9jb3VudAotICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHBhdGg7CisgICAgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHBhdGg7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgICByZXR1cm4gZmllbWFwOwpAQCAtOTksMTAgKzk0LDkgQEAKIAogbmFtZXNwYWNlIHsKIAotc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IGFsbG9jX2ZpZW1hcCh1aW50MzJfdCBleHRlbnRfY291bnQpCi17CitzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gYWxsb2NfZmllbWFwKHVpbnQzMl90IGV4dGVudF9jb3VudCkgewogICAgIHNpemVfdCBhbGxvY3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgZmllbWFwLCBmbV9leHRlbnRzW2V4dGVudF9jb3VudF0pOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiByZXMobmV3ICg6Om9wZXJhdG9yIG5ldyAoYWxsb2NzaXplKSkgc3RydWN0IGZpZW1hcCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IHJlcyhuZXcgKDo6b3BlcmF0b3IgbmV3KGFsbG9jc2l6ZSkpIHN0cnVjdCBmaWVtYXApOwogICAgIG1lbXNldChyZXMuZ2V0KCksIDAsIGFsbG9jc2l6ZSk7CiAgICAgcmVzLT5mbV9zdGFydCA9IDA7CiAgICAgcmVzLT5mbV9sZW5ndGggPSBVSU5UNjRfTUFYOwpAQCAtMTEyLDQgKzEwNiw0IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotfQorfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9GaWxlRGV2aWNlVXRpbHMuaCBiL0ZpbGVEZXZpY2VVdGlscy5oCmluZGV4IDRjMWQ0OWEuLjQ0MjhjZWYgMTAwNjQ0Ci0tLSBhL0ZpbGVEZXZpY2VVdGlscy5oCisrKyBiL0ZpbGVEZXZpY2VVdGlscy5oCkBAIC0xNywxNyArMTcsMTcgQEAKICNpZm5kZWYgQU5EUk9JRF9WT0xEX0ZJTEVERVZJQ0VVVElMU19ICiAjZGVmaW5lIEFORFJPSURfVk9MRF9GSUxFREVWSUNFVVRJTFNfSAogCi0jaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgorI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewogCiAvLyBHaXZlbiBhIGZpbGUgcGF0aCwgbG9vayBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgZGV2aWNlIGluIC9wcm9jL21vdW50Ci1zdGQ6OnN0cmluZyBCbG9ja0RldmljZUZvclBhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpOworc3RkOjpzdHJpbmcgQmxvY2tEZXZpY2VGb3JQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIAogLy8gUmVhZCB0aGUgZmlsZSdzIEZJRU1BUAotc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IFBhdGhGaWVtYXAoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsIHVpbnQzMl90IGV4dGVudF9jb3VudCk7CitzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gUGF0aEZpZW1hcChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgdWludDMyX3QgZXh0ZW50X2NvdW50KTsKIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9FeHQ0Q3J5cHQuY3BwIGIvRnNDcnlwdC5jcHAKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gRXh0NENyeXB0LmNwcApyZW5hbWUgdG8gRnNDcnlwdC5jcHAKaW5kZXggNjdiN2U5MC4uY2YxNzljNCAxMDA2NDQKLS0tIGEvRXh0NENyeXB0LmNwcAorKysgYi9Gc0NyeXB0LmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgorI2luY2x1ZGUgIkZzQ3J5cHQuaCIKIAogI2luY2x1ZGUgIktleVN0b3JhZ2UuaCIKICNpbmNsdWRlICJLZXlVdGlsLmgiCkBAIC0zMSwxMiArMzEsMTIgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCkBAIC01MCwxMyArNTAsMTQgQEAKICNpbmNsdWRlIDxjdXRpbHMvZnMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCi0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+CisjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CiAjaW5jbHVkZSA8a2V5dXRpbHMuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlOwpAQCAtNzEsNyArNzIsNyBAQAogICAgIHN0ZDo6c3RyaW5nIGtleV9yYXdfcmVmOwogfTsKIAotY29uc3Qgc3RkOjpzdHJpbmcgZGV2aWNlX2tleV9kaXIgPSBzdGQ6OnN0cmluZygpICsgREFUQV9NTlRfUE9JTlQgKyBlNGNyeXB0X3VuZW5jcnlwdGVkX2ZvbGRlcjsKK2NvbnN0IHN0ZDo6c3RyaW5nIGRldmljZV9rZXlfZGlyID0gc3RkOjpzdHJpbmcoKSArIERBVEFfTU5UX1BPSU5UICsgZnNjcnlwdF91bmVuY3J5cHRlZF9mb2xkZXI7CiBjb25zdCBzdGQ6OnN0cmluZyBkZXZpY2Vfa2V5X3BhdGggPSBkZXZpY2Vfa2V5X2RpciArICIva2V5IjsKIGNvbnN0IHN0ZDo6c3RyaW5nIGRldmljZV9rZXlfdGVtcCA9IGRldmljZV9rZXlfZGlyICsgIi90ZW1wIjsKIApAQCAtOTMsOSArOTQsOSBAQAogLy8gVE9ETyBhYm9saXNoIHRoaXMgbWFwLCBwZXIgYi8yNjk0ODA1Mwogc3RkOjptYXA8dXNlcmlkX3QsIEtleUJ1ZmZlcj4gc19jZV9rZXlzOwogCi19Cit9ICAvLyBuYW1lc3BhY2UKIAotc3RhdGljIGJvb2wgZTRjcnlwdF9pc19lbXVsYXRlZCgpIHsKK3N0YXRpYyBib29sIGZzY3J5cHRfaXNfZW11bGF0ZWQoKSB7CiAgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LnN5cy5lbXVsYXRlX2ZiZSIsIGZhbHNlKTsKIH0KIApAQCAtMTQ1LDggKzE0Niw3IEBACiB9CiAKIHN0YXRpYyBib29sIGdldF9jZV9rZXlfbmV3X3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcmVjdG9yeV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHBhdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY2Vfa2V5X3BhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXRocywgc3RkOjpzdHJpbmcqIGNlX2tleV9wYXRoKSB7CiAgICAgaWYgKHBhdGhzLmVtcHR5KCkpIHsKICAgICAgICAgKmNlX2tleV9wYXRoID0gZ2V0X2NlX2tleV9jdXJyZW50X3BhdGgoZGlyZWN0b3J5X3BhdGgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE2Myw5ICsxNjMsOSBAQAogCiAvLyBEaXNjYXJkIGFsbCBrZXlzIGJ1dCB0aGUgbmFtZWQgb25lOyByZW5hbWUgaXQgdG8gY2Fub25pY2FsIG5hbWUuCiAvLyBObyBwb2ludCBpbiBhY3Rpbmcgb24gZXJyb3JzIGluIHRoaXM7IGlnbm9yZSB0aGVtLgotc3RhdGljIHZvaWQgZml4YXRlX3VzZXJfY2Vfa2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJlY3RvcnlfcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcgJnRvX2ZpeCwKK3N0YXRpYyB2b2lkIGZpeGF0ZV91c2VyX2NlX2tleShjb25zdCBzdGQ6OnN0cmluZyYgZGlyZWN0b3J5X3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b19maXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXRocykgewotICAgIGZvciAoYXV0byBjb25zdCBvdGhlcl9wYXRoOiBwYXRocykgeworICAgIGZvciAoYXV0byBjb25zdCBvdGhlcl9wYXRoIDogcGF0aHMpIHsKICAgICAgICAgaWYgKG90aGVyX3BhdGggIT0gdG9fZml4KSB7CiAgICAgICAgICAgICBhbmRyb2lkOjp2b2xkOjpkZXN0cm95S2V5KG90aGVyX3BhdGgpOwogICAgICAgICB9CkBAIC0xNzMsMTggKzE3MywzNSBAQAogICAgIGF1dG8gY29uc3QgY3VycmVudF9wYXRoID0gZ2V0X2NlX2tleV9jdXJyZW50X3BhdGgoZGlyZWN0b3J5X3BhdGgpOwogICAgIGlmICh0b19maXggIT0gY3VycmVudF9wYXRoKSB7CiAgICAgICAgIExPRyhERUJVRykgPDwgIlJlbmFtaW5nICIgPDwgdG9fZml4IDw8ICIgdG8gIiA8PCBjdXJyZW50X3BhdGg7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkoCisgICAgICAgICAgICBvcGVuKHRvX2ZpeC5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpKTsKKyAgICAgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gIiA8PCB0b19maXg7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZzeW5jKGZkKSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVST0ZTIHx8IGVycm5vID09IEVJTlZBTCkgeworICAgICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIlNraXAgZnN5bmMgIiA8PCB0b19maXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgb24gYSBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IHN5bmNocm9uaXphdGlvbiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZnN5bmMgIiA8PCB0b19maXg7CisgICAgICAgICAgICAgICAgdW5saW5rKHRvX2ZpeC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKHJlbmFtZSh0b19maXguY19zdHIoKSwgY3VycmVudF9wYXRoLmNfc3RyKCkpICE9IDApIHsKICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIlVuYWJsZSB0byByZW5hbWUgIiA8PCB0b19maXggPDwgIiB0byAiIDw8IGN1cnJlbnRfcGF0aDsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIH0KIAogc3RhdGljIGJvb2wgcmVhZF9hbmRfZml4YXRlX3VzZXJfY2Vfa2V5KHVzZXJpZF90IHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6dm9sZDo6S2V5QXV0aGVudGljYXRpb24mIGF1dGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5QnVmZmVyICpjZV9rZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlCdWZmZXIqIGNlX2tleSkgewogICAgIGF1dG8gY29uc3QgZGlyZWN0b3J5X3BhdGggPSBnZXRfY2Vfa2V5X2RpcmVjdG9yeV9wYXRoKHVzZXJfaWQpOwogICAgIGF1dG8gY29uc3QgcGF0aHMgPSBnZXRfY2Vfa2V5X3BhdGhzKGRpcmVjdG9yeV9wYXRoKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgY2Vfa2V5X3BhdGg6IHBhdGhzKSB7CisgICAgZm9yIChhdXRvIGNvbnN0IGNlX2tleV9wYXRoIDogcGF0aHMpIHsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiVHJ5aW5nIHVzZXIgQ0Uga2V5ICIgPDwgY2Vfa2V5X3BhdGg7CiAgICAgICAgIGlmIChhbmRyb2lkOjp2b2xkOjpyZXRyaWV2ZUtleShjZV9rZXlfcGF0aCwgYXV0aCwgY2Vfa2V5KSkgewogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBrZXkiOwpAQCAtMjQyLDEyICsyNTksMTQgQEAKICAgICAgICAgYXV0byBjb25zdCBwYXRocyA9IGdldF9jZV9rZXlfcGF0aHMoZGlyZWN0b3J5X3BhdGgpOwogICAgICAgICBzdGQ6OnN0cmluZyBjZV9rZXlfcGF0aDsKICAgICAgICAgaWYgKCFnZXRfY2Vfa2V5X25ld19wYXRoKGRpcmVjdG9yeV9wYXRoLCBwYXRocywgJmNlX2tleV9wYXRoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShjZV9rZXlfcGF0aCwgdXNlcl9rZXlfdGVtcCwKLSAgICAgICAgICAgICAgICBrRW1wdHlBdXRoZW50aWNhdGlvbiwgY2Vfa2V5KSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShjZV9rZXlfcGF0aCwgdXNlcl9rZXlfdGVtcCwga0VtcHR5QXV0aGVudGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlX2tleSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGZpeGF0ZV91c2VyX2NlX2tleShkaXJlY3RvcnlfcGF0aCwgY2Vfa2V5X3BhdGgsIHBhdGhzKTsKICAgICAgICAgLy8gV3JpdGUgREUga2V5IHNlY29uZDsgb25jZSB0aGlzIGlzIHdyaXR0ZW4sIGFsbCBpcyBnb29kLgogICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShnZXRfZGVfa2V5X3BhdGgodXNlcl9pZCksIHVzZXJfa2V5X3RlbXAsCi0gICAgICAgICAgICAgICAga0VtcHR5QXV0aGVudGljYXRpb24sIGRlX2tleSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VtcHR5QXV0aGVudGljYXRpb24sIGRlX2tleSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHN0ZDo6c3RyaW5nIGRlX3Jhd19yZWY7CiAgICAgaWYgKCFhbmRyb2lkOjp2b2xkOjppbnN0YWxsS2V5KGRlX2tleSwgJmRlX3Jhd19yZWYpKSByZXR1cm4gZmFsc2U7CkBAIC0yODEsNyArMzAwLDcgQEAKIH0KIAogc3RhdGljIGJvb2wgZW5zdXJlX3BvbGljeShjb25zdCBQb2xpY3lLZXlSZWYmIGtleV9yZWYsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gICAgcmV0dXJuIGU0Y3J5cHRfcG9saWN5X2Vuc3VyZShwYXRoLmNfc3RyKCksIGtleV9yZWYua2V5X3Jhd19yZWYuZGF0YSgpLAorICAgIHJldHVybiBmc2NyeXB0X3BvbGljeV9lbnN1cmUocGF0aC5jX3N0cigpLCBrZXlfcmVmLmtleV9yYXdfcmVmLmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9yZWYua2V5X3Jhd19yZWYuc2l6ZSgpLCBrZXlfcmVmLmNvbnRlbnRzX21vZGUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9yZWYuZmlsZW5hbWVzX21vZGUuY19zdHIoKSkgPT0gMDsKIH0KQEAgLTMyNSwxMyArMzQ0LDEzIEBACiAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJbnN0YWxsZWQgZGUga2V5IGZvciB1c2VyICIgPDwgdXNlcl9pZDsKICAgICAgICAgfQogICAgIH0KLSAgICAvLyBleHQ0ZW5jOlRPRE86IGdvIHRocm91Z2ggYWxsIERFIGRpcmVjdG9yaWVzLCBlbnN1cmUgdGhhdCBhbGwgdXNlciBkaXJzIGhhdmUgdGhlCisgICAgLy8gZnNjcnlwdDpUT0RPOiBnbyB0aHJvdWdoIGFsbCBERSBkaXJlY3RvcmllcywgZW5zdXJlIHRoYXQgYWxsIHVzZXIgZGlycyBoYXZlIHRoZQogICAgIC8vIGNvcnJlY3QgcG9saWN5IHNldCBvbiB0aGVtLCBhbmQgdGhhdCBubyByb2d1ZSBvbmVzIGV4aXN0LgogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIGU0Y3J5cHRfaW5pdGlhbGl6ZV9nbG9iYWxfZGUoKSB7Ci0gICAgTE9HKElORk8pIDw8ICJlNGNyeXB0X2luaXRpYWxpemVfZ2xvYmFsX2RlIjsKK2Jvb2wgZnNjcnlwdF9pbml0aWFsaXplX2dsb2JhbF9kZSgpIHsKKyAgICBMT0coSU5GTykgPDwgImZzY3J5cHRfaW5pdGlhbGl6ZV9nbG9iYWxfZGUiOwogCiAgICAgaWYgKHNfZ2xvYmFsX2RlX2luaXRpYWxpemVkKSB7CiAgICAgICAgIExPRyhJTkZPKSA8PCAiQWxyZWFkeSBpbml0aWFsaXplZCI7CkBAIC0zNDUsMTMgKzM2NCwxMyBAQAogICAgIGdldF9kYXRhX2ZpbGVfZW5jcnlwdGlvbl9tb2RlcygmZGV2aWNlX3JlZik7CiAKICAgICBzdGQ6OnN0cmluZyBtb2Rlc3RyaW5nID0gZGV2aWNlX3JlZi5jb250ZW50c19tb2RlICsgIjoiICsgZGV2aWNlX3JlZi5maWxlbmFtZXNfbW9kZTsKLSAgICBzdGQ6OnN0cmluZyBtb2RlX2ZpbGVuYW1lID0gc3RkOjpzdHJpbmcoIi9kYXRhIikgKyBlNGNyeXB0X2tleV9tb2RlOworICAgIHN0ZDo6c3RyaW5nIG1vZGVfZmlsZW5hbWUgPSBzdGQ6OnN0cmluZygiL2RhdGEiKSArIGZzY3J5cHRfa2V5X21vZGU7CiAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZShtb2Rlc3RyaW5nLCBtb2RlX2ZpbGVuYW1lKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHNhdmUgdHlwZSI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyByZWZfZmlsZW5hbWUgPSBzdGQ6OnN0cmluZygiL2RhdGEiKSArIGU0Y3J5cHRfa2V5X3JlZjsKKyAgICBzdGQ6OnN0cmluZyByZWZfZmlsZW5hbWUgPSBzdGQ6OnN0cmluZygiL2RhdGEiKSArIGZzY3J5cHRfa2V5X3JlZjsKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKGRldmljZV9yZWYua2V5X3Jhd19yZWYsIHJlZl9maWxlbmFtZSkpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNhbm5vdCBzYXZlIGtleSByZWZlcmVuY2UgdG86IiA8PCByZWZfZmlsZW5hbWU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTM2Miw5ICszODEsOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIGU0Y3J5cHRfaW5pdF91c2VyMCgpIHsKLSAgICBMT0coREVCVUcpIDw8ICJlNGNyeXB0X2luaXRfdXNlcjAiOwotICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7Citib29sIGZzY3J5cHRfaW5pdF91c2VyMCgpIHsKKyAgICBMT0coREVCVUcpIDw8ICJmc2NyeXB0X2luaXRfdXNlcjAiOworICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIodXNlcl9rZXlfZGlyLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIodXNlcl9rZXlfZGlyICsgIi9jZSIsIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkpIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKCFwcmVwYXJlX2Rpcih1c2VyX2tleV9kaXIgKyAiL2RlIiwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSkgcmV0dXJuIGZhbHNlOwpAQCAtMzc4LDI4ICszOTcsMjggQEAKICAgICAvLyBXZSBjYW4gb25seSBzYWZlbHkgcHJlcGFyZSBERSBzdG9yYWdlIGhlcmUsIHNpbmNlIENFIGtleXMgYXJlIHByb2JhYmx5CiAgICAgLy8gZW50YW5nbGVkIHdpdGggdXNlciBjcmVkZW50aWFscy4gIFRoZSBmcmFtZXdvcmsgd2lsbCBhbHdheXMgcHJlcGFyZSBDRQogICAgIC8vIHN0b3JhZ2Ugb25jZSBDRSBrZXlzIGFyZSBpbnN0YWxsZWQuCi0gICAgaWYgKCFlNGNyeXB0X3ByZXBhcmVfdXNlcl9zdG9yYWdlKCIiLCAwLCAwLCBhbmRyb2lkOjpvczo6SVZvbGQ6OlNUT1JBR0VfRkxBR19ERSkpIHsKKyAgICBpZiAoIWZzY3J5cHRfcHJlcGFyZV91c2VyX3N0b3JhZ2UoIiIsIDAsIDAsIGFuZHJvaWQ6Om9zOjpJVm9sZDo6U1RPUkFHRV9GTEFHX0RFKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcHJlcGFyZSB1c2VyIDAgc3RvcmFnZSI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyBJZiB0aGlzIGlzIGEgbm9uLUZCRSBkZXZpY2UgdGhhdCByZWNlbnRseSBsZWZ0IGFuIGVtdWxhdGVkIG1vZGUsCiAgICAgLy8gcmVzdG9yZSB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgdG8ga25vd24tZ29vZCBzdGF0ZS4KLSAgICBpZiAoIWU0Y3J5cHRfaXNfbmF0aXZlKCkgJiYgIWU0Y3J5cHRfaXNfZW11bGF0ZWQoKSkgewotICAgICAgICBlNGNyeXB0X3VubG9ja191c2VyX2tleSgwLCAwLCAiISIsICIhIik7CisgICAgaWYgKCFmc2NyeXB0X2lzX25hdGl2ZSgpICYmICFmc2NyeXB0X2lzX2VtdWxhdGVkKCkpIHsKKyAgICAgICAgZnNjcnlwdF91bmxvY2tfdXNlcl9rZXkoMCwgMCwgIiEiLCAiISIpOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIGU0Y3J5cHRfdm9sZF9jcmVhdGVfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgYm9vbCBlcGhlbWVyYWwpIHsKLSAgICBMT0coREVCVUcpIDw8ICJlNGNyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5IGZvciAiIDw8IHVzZXJfaWQgPDwgIiBzZXJpYWwgIiA8PCBzZXJpYWw7Ci0gICAgaWYgKCFlNGNyeXB0X2lzX25hdGl2ZSgpKSB7Citib29sIGZzY3J5cHRfdm9sZF9jcmVhdGVfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgYm9vbCBlcGhlbWVyYWwpIHsKKyAgICBMT0coREVCVUcpIDw8ICJmc2NyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5IGZvciAiIDw8IHVzZXJfaWQgPDwgIiBzZXJpYWwgIiA8PCBzZXJpYWw7CisgICAgaWYgKCFmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAvLyBGSVhNRSB0ZXN0IGZvciBleGlzdGVuY2Ugb2Yga2V5IHRoYXQgaXMgbm90IGxvYWRlZCB5ZXQKICAgICBpZiAoc19jZV9rZXlfcmF3X3JlZnMuY291bnQodXNlcl9pZCkgIT0gMCkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJBbHJlYWR5IGV4aXN0cywgY2FuJ3QgZTRjcnlwdF92b2xkX2NyZWF0ZV91c2VyX2tleSBmb3IgIiA8PCB1c2VyX2lkCisgICAgICAgIExPRyhFUlJPUikgPDwgIkFscmVhZHkgZXhpc3RzLCBjYW4ndCBmc2NyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5IGZvciAiIDw8IHVzZXJfaWQKICAgICAgICAgICAgICAgICAgICA8PCAiIHNlcmlhbCAiIDw8IHNlcmlhbDsKICAgICAgICAgLy8gRklYTUUgc2hvdWxkIHdlIGZhaWwgdGhlIGNvbW1hbmQ/CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNDMyLDIyICs0NTEsMjIgQEAKICAgICByZXR1cm4gc3VjY2VzczsKIH0KIAotYm9vbCBlNGNyeXB0X2Rlc3Ryb3lfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCkgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfZGVzdHJveV91c2VyX2tleSgiIDw8IHVzZXJfaWQgPDwgIikiOwotICAgIGlmICghZTRjcnlwdF9pc19uYXRpdmUoKSkgeworYm9vbCBmc2NyeXB0X2Rlc3Ryb3lfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCkgeworICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfZGVzdHJveV91c2VyX2tleSgiIDw8IHVzZXJfaWQgPDwgIikiOworICAgIGlmICghZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKICAgICBzdGQ6OnN0cmluZyByYXdfcmVmOwogICAgIHN1Y2Nlc3MgJj0gZXZpY3RfY2Vfa2V5KHVzZXJfaWQpOwotICAgIHN1Y2Nlc3MgJj0gbG9va3VwX2tleV9yZWYoc19kZV9rZXlfcmF3X3JlZnMsIHVzZXJfaWQsICZyYXdfcmVmKQotICAgICAgICAmJiBhbmRyb2lkOjp2b2xkOjpldmljdEtleShyYXdfcmVmKTsKKyAgICBzdWNjZXNzICY9CisgICAgICAgIGxvb2t1cF9rZXlfcmVmKHNfZGVfa2V5X3Jhd19yZWZzLCB1c2VyX2lkLCAmcmF3X3JlZikgJiYgYW5kcm9pZDo6dm9sZDo6ZXZpY3RLZXkocmF3X3JlZik7CiAgICAgc19kZV9rZXlfcmF3X3JlZnMuZXJhc2UodXNlcl9pZCk7CiAgICAgYXV0byBpdCA9IHNfZXBoZW1lcmFsX3VzZXJzLmZpbmQodXNlcl9pZCk7CiAgICAgaWYgKGl0ICE9IHNfZXBoZW1lcmFsX3VzZXJzLmVuZCgpKSB7CiAgICAgICAgIHNfZXBoZW1lcmFsX3VzZXJzLmVyYXNlKGl0KTsKICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGF1dG8gY29uc3QgcGF0aDogZ2V0X2NlX2tleV9wYXRocyhnZXRfY2Vfa2V5X2RpcmVjdG9yeV9wYXRoKHVzZXJfaWQpKSkgeworICAgICAgICBmb3IgKGF1dG8gY29uc3QgcGF0aCA6IGdldF9jZV9rZXlfcGF0aHMoZ2V0X2NlX2tleV9kaXJlY3RvcnlfcGF0aCh1c2VyX2lkKSkpIHsKICAgICAgICAgICAgIHN1Y2Nlc3MgJj0gYW5kcm9pZDo6dm9sZDo6ZGVzdHJveUtleShwYXRoKTsKICAgICAgICAgfQogICAgICAgICBhdXRvIGRlX2tleV9wYXRoID0gZ2V0X2RlX2tleV9wYXRoKHVzZXJfaWQpOwpAQCAtNDc4LDEzICs0OTcsMTMgQEAKICAgICBpZiAoY2htb2QocGF0aC5jX3N0cigpLCBtb2RlKSAhPSAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY2htb2QgIiA8PCBwYXRoOwogICAgICAgICAvLyBGSVhNRSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYi8yNjcxMzYyMgotICAgICAgICBpZiAoZTRjcnlwdF9pc19lbXVsYXRlZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChmc2NyeXB0X2lzX2VtdWxhdGVkKCkpIHJldHVybiBmYWxzZTsKICAgICB9CiAjaWYgRU1VTEFURURfVVNFU19TRUxJTlVYCiAgICAgaWYgKHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKHBhdGguY19zdHIoKSwgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fRk9SQ0UpICE9IDApIHsKICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHJlc3RvcmVjb24gIiA8PCBwYXRoOwogICAgICAgICAvLyBGSVhNRSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYi8yNjcxMzYyMgotICAgICAgICBpZiAoZTRjcnlwdF9pc19lbXVsYXRlZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChmc2NyeXB0X2lzX2VtdWxhdGVkKCkpIHJldHVybiBmYWxzZTsKICAgICB9CiAjZW5kaWYKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTU0NywyMyArNTY2LDIzIEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6OnZvbGQ6OmRlc3Ryb3lLZXkocGF0aCk7CiB9CiAKLWJvb2wgZTRjcnlwdF9hZGRfdXNlcl9rZXlfYXV0aCh1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW5faGV4LAorYm9vbCBmc2NyeXB0X2FkZF91c2VyX2tleV9hdXRoKHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbl9oZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldF9oZXgpIHsKLSAgICBMT0coREVCVUcpIDw8ICJlNGNyeXB0X2FkZF91c2VyX2tleV9hdXRoICIgPDwgdXNlcl9pZCA8PCAiIHNlcmlhbD0iIDw8IHNlcmlhbAorICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfYWRkX3VzZXJfa2V5X2F1dGggIiA8PCB1c2VyX2lkIDw8ICIgc2VyaWFsPSIgPDwgc2VyaWFsCiAgICAgICAgICAgICAgICA8PCAiIHRva2VuX3ByZXNlbnQ9IiA8PCAodG9rZW5faGV4ICE9ICIhIik7Ci0gICAgaWYgKCFlNGNyeXB0X2lzX25hdGl2ZSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIWZzY3J5cHRfaXNfbmF0aXZlKCkpIHJldHVybiB0cnVlOwogICAgIGlmIChzX2VwaGVtZXJhbF91c2Vycy5jb3VudCh1c2VyX2lkKSAhPSAwKSByZXR1cm4gdHJ1ZTsKICAgICBzdGQ6OnN0cmluZyB0b2tlbiwgc2VjcmV0OwogICAgIGlmICghcGFyc2VfaGV4KHRva2VuX2hleCwgJnRva2VuKSkgcmV0dXJuIGZhbHNlOwogICAgIGlmICghcGFyc2VfaGV4KHNlY3JldF9oZXgsICZzZWNyZXQpKSByZXR1cm4gZmFsc2U7Ci0gICAgYXV0byBhdXRoID0gc2VjcmV0LmVtcHR5KCkgPyBrRW1wdHlBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFuZHJvaWQ6OnZvbGQ6OktleUF1dGhlbnRpY2F0aW9uKHRva2VuLCBzZWNyZXQpOworICAgIGF1dG8gYXV0aCA9CisgICAgICAgIHNlY3JldC5lbXB0eSgpID8ga0VtcHR5QXV0aGVudGljYXRpb24gOiBhbmRyb2lkOjp2b2xkOjpLZXlBdXRoZW50aWNhdGlvbih0b2tlbiwgc2VjcmV0KTsKICAgICBhdXRvIGl0ID0gc19jZV9rZXlzLmZpbmQodXNlcl9pZCk7CiAgICAgaWYgKGl0ID09IHNfY2Vfa2V5cy5lbmQoKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJLZXkgbm90IGxvYWRlZCBpbnRvIG1lbW9yeSwgY2FuJ3QgY2hhbmdlIGZvciB1c2VyICIgPDwgdXNlcl9pZDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBjb25zdCBhdXRvICZjZV9rZXkgPSBpdC0+c2Vjb25kOworICAgIGNvbnN0IGF1dG8mIGNlX2tleSA9IGl0LT5zZWNvbmQ7CiAgICAgYXV0byBjb25zdCBkaXJlY3RvcnlfcGF0aCA9IGdldF9jZV9rZXlfZGlyZWN0b3J5X3BhdGgodXNlcl9pZCk7CiAgICAgYXV0byBjb25zdCBwYXRocyA9IGdldF9jZV9rZXlfcGF0aHMoZGlyZWN0b3J5X3BhdGgpOwogICAgIHN0ZDo6c3RyaW5nIGNlX2tleV9wYXRoOwpAQCAtNTcyLDkgKzU5MSw5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgZTRjcnlwdF9maXhhdGVfbmV3ZXN0X3VzZXJfa2V5X2F1dGgodXNlcmlkX3QgdXNlcl9pZCkgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfZml4YXRlX25ld2VzdF91c2VyX2tleV9hdXRoICIgPDwgdXNlcl9pZDsKLSAgICBpZiAoIWU0Y3J5cHRfaXNfbmF0aXZlKCkpIHJldHVybiB0cnVlOworYm9vbCBmc2NyeXB0X2ZpeGF0ZV9uZXdlc3RfdXNlcl9rZXlfYXV0aCh1c2VyaWRfdCB1c2VyX2lkKSB7CisgICAgTE9HKERFQlVHKSA8PCAiZnNjcnlwdF9maXhhdGVfbmV3ZXN0X3VzZXJfa2V5X2F1dGggIiA8PCB1c2VyX2lkOworICAgIGlmICghZnNjcnlwdF9pc19uYXRpdmUoKSkgcmV0dXJuIHRydWU7CiAgICAgaWYgKHNfZXBoZW1lcmFsX3VzZXJzLmNvdW50KHVzZXJfaWQpICE9IDApIHJldHVybiB0cnVlOwogICAgIGF1dG8gY29uc3QgZGlyZWN0b3J5X3BhdGggPSBnZXRfY2Vfa2V5X2RpcmVjdG9yeV9wYXRoKHVzZXJfaWQpOwogICAgIGF1dG8gY29uc3QgcGF0aHMgPSBnZXRfY2Vfa2V5X3BhdGhzKGRpcmVjdG9yeV9wYXRoKTsKQEAgLTU4NywxMSArNjA2LDExIEBACiB9CiAKIC8vIFRPRE86IHJlbmFtZSB0byAnaW5zdGFsbCcgZm9yIGNvbnNpc3RlbmN5LCBhbmQgdGFrZSBmbGFncyB0byBrbm93IHdoaWNoIGtleXMgdG8gaW5zdGFsbAotYm9vbCBlNGNyeXB0X3VubG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW5faGV4LAorYm9vbCBmc2NyeXB0X3VubG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW5faGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjcmV0X2hleCkgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfdW5sb2NrX3VzZXJfa2V5ICIgPDwgdXNlcl9pZCA8PCAiIHNlcmlhbD0iIDw8IHNlcmlhbAorICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfdW5sb2NrX3VzZXJfa2V5ICIgPDwgdXNlcl9pZCA8PCAiIHNlcmlhbD0iIDw8IHNlcmlhbAogICAgICAgICAgICAgICAgPDwgIiB0b2tlbl9wcmVzZW50PSIgPDwgKHRva2VuX2hleCAhPSAiISIpOwotICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgaWYgKHNfY2Vfa2V5X3Jhd19yZWZzLmNvdW50KHVzZXJfaWQpICE9IDApIHsKICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVHJpZWQgdG8gdW5sb2NrIGFscmVhZHktdW5sb2NrZWQga2V5IGZvciB1c2VyICIgPDwgdXNlcl9pZDsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNjIwLDExICs2MzksMTEgQEAKIH0KIAogLy8gVE9ETzogcmVuYW1lIHRvICdldmljdCcgZm9yIGNvbnNpc3RlbmN5Ci1ib29sIGU0Y3J5cHRfbG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkKSB7Ci0gICAgTE9HKERFQlVHKSA8PCAiZTRjcnlwdF9sb2NrX3VzZXJfa2V5ICIgPDwgdXNlcl9pZDsKLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworYm9vbCBmc2NyeXB0X2xvY2tfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCkgeworICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfbG9ja191c2VyX2tleSAiIDw8IHVzZXJfaWQ7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgcmV0dXJuIGV2aWN0X2NlX2tleSh1c2VyX2lkKTsKLSAgICB9IGVsc2UgaWYgKGU0Y3J5cHRfaXNfZW11bGF0ZWQoKSkgeworICAgIH0gZWxzZSBpZiAoZnNjcnlwdF9pc19lbXVsYXRlZCgpKSB7CiAgICAgICAgIC8vIFdoZW4gaW4gZW11bGF0aW9uIG1vZGUsIHdlIGp1c3QgdXNlIGNobW9kCiAgICAgICAgIGlmICghZW11bGF0ZWRfbG9jayhhbmRyb2lkOjp2b2xkOjpCdWlsZERhdGFTeXN0ZW1DZVBhdGgodXNlcl9pZCkpIHx8CiAgICAgICAgICAgICAhZW11bGF0ZWRfbG9jayhhbmRyb2lkOjp2b2xkOjpCdWlsZERhdGFNaXNjQ2VQYXRoKHVzZXJfaWQpKSB8fApAQCAtNjQ5LDkgKzY2OCw5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgZTRjcnlwdF9wcmVwYXJlX3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsCitib29sIGZzY3J5cHRfcHJlcGFyZV91c2VyX3N0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbHVtZV91dWlkLCB1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfcHJlcGFyZV91c2VyX3N0b3JhZ2UgZm9yIHZvbHVtZSAiIDw8IGVzY2FwZV9lbXB0eSh2b2x1bWVfdXVpZCkKKyAgICBMT0coREVCVUcpIDw8ICJmc2NyeXB0X3ByZXBhcmVfdXNlcl9zdG9yYWdlIGZvciB2b2x1bWUgIiA8PCBlc2NhcGVfZW1wdHkodm9sdW1lX3V1aWQpCiAgICAgICAgICAgICAgICA8PCAiLCB1c2VyICIgPDwgdXNlcl9pZCA8PCAiLCBzZXJpYWwgIiA8PCBzZXJpYWwgPDwgIiwgZmxhZ3MgIiA8PCBmbGFnczsKIAogICAgIGlmIChmbGFncyAmIGFuZHJvaWQ6Om9zOjpJVm9sZDo6U1RPUkFHRV9GTEFHX0RFKSB7CkBAIC02NzAsNyArNjg5LDggQEAKICAgICAgICAgICAgIGlmICghcHJlcGFyZV9kaXIoc3lzdGVtX2xlZ2FjeV9wYXRoLCAwNzAwLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSkgcmV0dXJuIGZhbHNlOwogI2lmIE1BTkFHRV9NSVNDX0RJUlMKICAgICAgICAgICAgIGlmICghcHJlcGFyZV9kaXIobWlzY19sZWdhY3lfcGF0aCwgMDc1MCwgbXVsdGl1c2VyX2dldF91aWQodXNlcl9pZCwgQUlEX1NZU1RFTSksCi0gICAgICAgICAgICAgICAgICAgIG11bHRpdXNlcl9nZXRfdWlkKHVzZXJfaWQsIEFJRF9FVkVSWUJPRFkpKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXVzZXJfZ2V0X3VpZCh1c2VyX2lkLCBBSURfRVZFUllCT0RZKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogI2VuZGlmCiAgICAgICAgICAgICBpZiAoIXByZXBhcmVfZGlyKHByb2ZpbGVzX2RlX3BhdGgsIDA3NzEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pKSByZXR1cm4gZmFsc2U7CiAKQEAgLTY4MCw3ICs3MDAsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIodXNlcl9kZV9wYXRoLCAwNzcxLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSkgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgICAgICBQb2xpY3lLZXlSZWYgZGVfcmVmOwogICAgICAgICAgICAgaWYgKHZvbHVtZV91dWlkLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIWxvb2t1cF9rZXlfcmVmKHNfZGVfa2V5X3Jhd19yZWZzLCB1c2VyX2lkLCAmZGVfcmVmLmtleV9yYXdfcmVmKSkgcmV0dXJuIGZhbHNlOwpAQCAtNzExLDcgKzczMSw3IEBACiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIobWVkaWFfY2VfcGF0aCwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIodXNlcl9jZV9wYXRoLCAwNzcxLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSkgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgICAgICBQb2xpY3lLZXlSZWYgY2VfcmVmOwogICAgICAgICAgICAgaWYgKHZvbHVtZV91dWlkLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIWxvb2t1cF9rZXlfcmVmKHNfY2Vfa2V5X3Jhd19yZWZzLCB1c2VyX2lkLCAmY2VfcmVmLmtleV9yYXdfcmVmKSkgcmV0dXJuIGZhbHNlOwpAQCAtNzQwLDggKzc2MCw4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgZTRjcnlwdF9kZXN0cm95X3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBmbGFncykgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfZGVzdHJveV91c2VyX3N0b3JhZ2UgZm9yIHZvbHVtZSAiIDw8IGVzY2FwZV9lbXB0eSh2b2x1bWVfdXVpZCkKK2Jvb2wgZnNjcnlwdF9kZXN0cm95X3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBmbGFncykgeworICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfZGVzdHJveV91c2VyX3N0b3JhZ2UgZm9yIHZvbHVtZSAiIDw8IGVzY2FwZV9lbXB0eSh2b2x1bWVfdXVpZCkKICAgICAgICAgICAgICAgIDw8ICIsIHVzZXIgIiA8PCB1c2VyX2lkIDw8ICIsIGZsYWdzICIgPDwgZmxhZ3M7CiAgICAgYm9vbCByZXMgPSB0cnVlOwogCkBAIC03NjIsNyArNzgyLDcgQEAKICAgICAgICAgICAgIHJlcyAmPSBkZXN0cm95X2RpcihtaXNjX2NlX3BhdGgpOwogICAgICAgICAgICAgcmVzICY9IGRlc3Ryb3lfZGlyKHZlbmRvcl9jZV9wYXRoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgICAgICAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICAgICAgICAgIHJlcyAmPSBkZXN0cm95X3ZvbGtleShtaXNjX2NlX3BhdGgsIHZvbHVtZV91dWlkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzkxLDcgKzgxMSw3IEBACiAgICAgICAgICAgICByZXMgJj0gZGVzdHJveV9kaXIobWlzY19kZV9wYXRoKTsKICAgICAgICAgICAgIHJlcyAmPSBkZXN0cm95X2Rpcih2ZW5kb3JfZGVfcGF0aCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworICAgICAgICAgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgICAgICAgICByZXMgJj0gZGVzdHJveV92b2xrZXkobWlzY19kZV9wYXRoLCB2b2x1bWVfdXVpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgyNiw5ICs4NDYsOSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLWJvb2wgZTRjcnlwdF9kZXN0cm95X3ZvbHVtZV9rZXlzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2x1bWVfdXVpZCkgeworYm9vbCBmc2NyeXB0X2Rlc3Ryb3lfdm9sdW1lX2tleXMoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbHVtZV91dWlkKSB7CiAgICAgYm9vbCByZXMgPSB0cnVlOwotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfZGVzdHJveV92b2x1bWVfa2V5cyBmb3Igdm9sdW1lICIgPDwgZXNjYXBlX2VtcHR5KHZvbHVtZV91dWlkKTsKKyAgICBMT0coREVCVUcpIDw8ICJmc2NyeXB0X2Rlc3Ryb3lfdm9sdW1lX2tleXMgZm9yIHZvbHVtZSAiIDw8IGVzY2FwZV9lbXB0eSh2b2x1bWVfdXVpZCk7CiAgICAgYXV0byBzZWNkaXNjYXJkYWJsZV9wYXRoID0gdm9sdW1lX3NlY2Rpc2NhcmRhYmxlX3BhdGgodm9sdW1lX3V1aWQpOwogICAgIHJlcyAmPSBhbmRyb2lkOjp2b2xkOjpydW5TZWNkaXNjYXJkU2luZ2xlKHNlY2Rpc2NhcmRhYmxlX3BhdGgpOwogICAgIHJlcyAmPSBkZXN0cm95X3ZvbHVtZV9rZXlzKCIvZGF0YS9taXNjX2NlIiwgdm9sdW1lX3V1aWQpOwpkaWZmIC0tZ2l0IGEvRXh0NENyeXB0LmggYi9Gc0NyeXB0LmgKc2ltaWxhcml0eSBpbmRleCA2MSUKcmVuYW1lIGZyb20gRXh0NENyeXB0LmgKcmVuYW1lIHRvIEZzQ3J5cHQuaAppbmRleCBhNDNhNjhhLi4xNmUyZjlhIDEwMDY0NAotLS0gYS9FeHQ0Q3J5cHQuaAorKysgYi9Gc0NyeXB0LmgKQEAgLTE4LDIxICsxOCwyMSBAQAogCiAjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogCi1ib29sIGU0Y3J5cHRfaW5pdGlhbGl6ZV9nbG9iYWxfZGUoKTsKK2Jvb2wgZnNjcnlwdF9pbml0aWFsaXplX2dsb2JhbF9kZSgpOwogCi1ib29sIGU0Y3J5cHRfaW5pdF91c2VyMCgpOwotYm9vbCBlNGNyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5KHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsIGJvb2wgZXBoZW1lcmFsKTsKLWJvb2wgZTRjcnlwdF9kZXN0cm95X3VzZXJfa2V5KHVzZXJpZF90IHVzZXJfaWQpOwotYm9vbCBlNGNyeXB0X2FkZF91c2VyX2tleV9hdXRoKHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwKK2Jvb2wgZnNjcnlwdF9pbml0X3VzZXIwKCk7Citib29sIGZzY3J5cHRfdm9sZF9jcmVhdGVfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgYm9vbCBlcGhlbWVyYWwpOworYm9vbCBmc2NyeXB0X2Rlc3Ryb3lfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCk7Citib29sIGZzY3J5cHRfYWRkX3VzZXJfa2V5X2F1dGgodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpOwotYm9vbCBlNGNyeXB0X2ZpeGF0ZV9uZXdlc3RfdXNlcl9rZXlfYXV0aCh1c2VyaWRfdCB1c2VyX2lkKTsKK2Jvb2wgZnNjcnlwdF9maXhhdGVfbmV3ZXN0X3VzZXJfa2V5X2F1dGgodXNlcmlkX3QgdXNlcl9pZCk7CiAKLWJvb2wgZTRjcnlwdF91bmxvY2tfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAorYm9vbCBmc2NyeXB0X3VubG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpOwotYm9vbCBlNGNyeXB0X2xvY2tfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCk7Citib29sIGZzY3J5cHRfbG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkKTsKIAotYm9vbCBlNGNyeXB0X3ByZXBhcmVfdXNlcl9zdG9yYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2x1bWVfdXVpZCwgdXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwKK2Jvb2wgZnNjcnlwdF9wcmVwYXJlX3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKLWJvb2wgZTRjcnlwdF9kZXN0cm95X3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBmbGFncyk7Citib29sIGZzY3J5cHRfZGVzdHJveV91c2VyX3N0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbHVtZV91dWlkLCB1c2VyaWRfdCB1c2VyX2lkLCBpbnQgZmxhZ3MpOwogCi1ib29sIGU0Y3J5cHRfZGVzdHJveV92b2x1bWVfa2V5cyhjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQpOworYm9vbCBmc2NyeXB0X2Rlc3Ryb3lfdm9sdW1lX2tleXMoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbHVtZV91dWlkKTsKZGlmZiAtLWdpdCBhL0lkbGVNYWludC5jcHAgYi9JZGxlTWFpbnQuY3BwCmluZGV4IDVhMTliOGMuLjc5ODk0ZmMgMTAwNjQ0Ci0tLSBhL0lkbGVNYWludC5jcHAKKysrIGIvSWRsZU1haW50LmNwcApAQCAtMjQsMTggKzI0LDIwIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvY2hyb25vX3V0aWxzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2hlYWx0aC9zdG9yYWdlLzEuMC9JU3RvcmFnZS5oPgogI2luY2x1ZGUgPGZzX21nci5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCiAjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWU7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nOwpAQCAtNDMsNiArNDUsMTEgQEAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlRpbWVyOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGVhbHRoOjpzdG9yYWdlOjpWMV8wOjpJR2FyYmFnZUNvbGxlY3RDYWxsYmFjazsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OnN0b3JhZ2U6OlYxXzA6OklTdG9yYWdlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6c3RvcmFnZTo6VjFfMDo6UmVzdWx0OwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CkBAIC03Myw4ICs4MCw3IEBACiBzdGF0aWMgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY3ZfYWJvcnQsIGN2X3N0b3A7CiBzdGF0aWMgc3RkOjptdXRleCBjdl9tOwogCi1zdGF0aWMgdm9pZCBhZGRGcm9tVm9sdW1lTWFuYWdlcihzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+KiBwYXRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhUeXBlcyBwYXRoX3R5cGUpIHsKK3N0YXRpYyB2b2lkIGFkZEZyb21Wb2x1bWVNYW5hZ2VyKHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4qIHBhdGhzLCBQYXRoVHlwZXMgcGF0aF90eXBlKSB7CiAgICAgVm9sdW1lTWFuYWdlciogdm0gPSBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpOwogICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gcHJpdmF0ZUlkczsKICAgICB2bS0+bGlzdFZvbHVtZXMoVm9sdW1lQmFzZTo6VHlwZTo6a1ByaXZhdGUsIHByaXZhdGVJZHMpOwpAQCAtODgsMTEgKzk0LDkgQEAKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNfdHlwZSA9IHZvbC0+Z2V0RnNUeXBlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGZzX3R5cGUgPT0gImYyZnMiICYmIChSZWFscGF0aCh2b2wtPmdldFJhd0RtRGV2UGF0aCgpLCAmZ2NfcGF0aCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxwYXRoKHZvbC0+Z2V0UmF3RGV2UGF0aCgpLCAmZ2NfcGF0aCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc190eXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKyBCYXNlbmFtZShnY19wYXRoKSk7CisgICAgICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc190eXBlICsgIi8iICsgQmFzZW5hbWUoZ2NfcGF0aCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTAwLDcgKzEwNCw3IEBACiBzdGF0aWMgdm9pZCBhZGRGcm9tRnN0YWIoc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiogcGF0aHMsIFBhdGhUeXBlcyBwYXRoX3R5cGUpIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZnN0YWIsIGRlY2x0eXBlKCZmc19tZ3JfZnJlZV9mc3RhYik+IGZzdGFiKGZzX21ncl9yZWFkX2ZzdGFiX2RlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX21ncl9mcmVlX2ZzdGFiKTsKLSAgICBzdHJ1Y3QgZnN0YWJfcmVjICpwcmV2X3JlYyA9IE5VTEw7CisgICAgc3RydWN0IGZzdGFiX3JlYyogcHJldl9yZWMgPSBOVUxMOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmc3RhYi0+bnVtX2VudHJpZXM7IGkrKykgewogICAgICAgICBhdXRvIGZzX3R5cGUgPSBzdGQ6OnN0cmluZyhmc3RhYi0+cmVjc1tpXS5mc190eXBlKTsKQEAgLTEzMSwxMCArMTM1LDExIEBACiAgICAgICAgIH0gZWxzZSBpZiAocGF0aF90eXBlID09IFBhdGhUeXBlczo6a0Jsa0RldmljZSkgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2NfcGF0aDsKICAgICAgICAgICAgIGlmIChzdGQ6OnN0cmluZyhmc3RhYi0+cmVjc1tpXS5mc190eXBlKSA9PSAiZjJmcyIgJiYKLSAgICAgICAgICAgICAgICBSZWFscGF0aChhbmRyb2lkOjp2b2xkOjpCbG9ja0RldmljZUZvclBhdGgoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGZzdGFiLT5yZWNzW2ldLm1vdW50X3BvaW50KSArICIvIiksICZnY19wYXRoKSkgewotICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc3RhYi0+cmVjc1tpXS5mc190eXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiArIEJhc2VuYW1lKGdjX3BhdGgpKTsKKyAgICAgICAgICAgICAgICBSZWFscGF0aCgKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6QmxvY2tEZXZpY2VGb3JQYXRoKHN0ZDo6c3RyaW5nKGZzdGFiLT5yZWNzW2ldLm1vdW50X3BvaW50KSArICIvIiksCisgICAgICAgICAgICAgICAgICAgICZnY19wYXRoKSkgeworICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc3RhYi0+cmVjc1tpXS5mc190eXBlICsgIi8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VuYW1lKGdjX3BhdGgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNzcsOCArMTgyLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5zZWNzX3QgdGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIlRyaW1tZWQgIiA8PCByYW5nZS5sZW4gPDwgIiBieXRlcyBvbiAiIDw8IHBhdGgKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyh0aW1lKSA8PCAibXMiOworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJUcmltbWVkICIgPDwgcmFuZ2UubGVuIDw8ICIgYnl0ZXMgb24gIiA8PCBwYXRoIDw8ICIgaW4gIgorICAgICAgICAgICAgICAgICAgICAgIDw8IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyh0aW1lKSA8PCAibXMiOwogICAgICAgICAgICAgZXh0cmFzLnB1dExvbmcoU3RyaW5nMTYoImJ5dGVzIiksIHJhbmdlLmxlbik7CiAgICAgICAgICAgICBleHRyYXMucHV0TG9uZyhTdHJpbmcxNigidGltZSIpLCB0aW1lKTsKICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgewpAQCAtMjIzLDggKzIyOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBsay5sb2NrKCk7Ci0gICAgICAgIGFib3J0ZWQgPSBjdl9hYm9ydC53YWl0X2ZvcihsaywgMTBzLCBbXXsKLSAgICAgICAgICAgIHJldHVybiBpZGxlX21haW50X3N0YXQgPT0gSWRsZU1haW50U3RhdHM6OmtBYm9ydDt9KTsKKyAgICAgICAgYWJvcnRlZCA9CisgICAgICAgICAgICBjdl9hYm9ydC53YWl0X2ZvcihsaywgMTBzLCBbXSB7IHJldHVybiBpZGxlX21haW50X3N0YXQgPT0gSWRsZU1haW50U3RhdHM6OmtBYm9ydDsgfSk7CiAgICAgICAgIGxrLnVubG9jaygpOwogICAgIH0KIApAQCAtMjU3LDEwICsyNjIsMTAgQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLXN0YXRpYyB2b2lkIHJ1bkRldkdjKHZvaWQpIHsKK3N0YXRpYyB2b2lkIHJ1bkRldkdjRnN0YWIodm9pZCkgewogICAgIHN0ZDo6dW5pcXVlX3B0cjxmc3RhYiwgZGVjbHR5cGUoJmZzX21ncl9mcmVlX2ZzdGFiKT4gZnN0YWIoZnNfbWdyX3JlYWRfZnN0YWJfZGVmYXVsdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfbWdyX2ZyZWVfZnN0YWIpOwotICAgIHN0cnVjdCBmc3RhYl9yZWMgKnJlYyA9IE5VTEw7CisgICAgc3RydWN0IGZzdGFiX3JlYyogcmVjID0gTlVMTDsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnN0YWItPm51bV9lbnRyaWVzOyBpKyspIHsKICAgICAgICAgaWYgKGZzX21ncl9oYXNfc3lzZnNfcGF0aCgmZnN0YWItPnJlY3NbaV0pKSB7CkBAIC0yODQsNyArMjg5LDcgQEAKICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIlJlYWRpbmcgbWFudWFsX2djIGZhaWxlZCBpbiAiIDw8IHBhdGg7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCisgICAgICAgIHJlcXVpcmUgPSBhbmRyb2lkOjpiYXNlOjpUcmltKHJlcXVpcmUpOwogICAgICAgICBpZiAocmVxdWlyZSA9PSAiIiB8fCByZXF1aXJlID09ICJvZmYiIHx8IHJlcXVpcmUgPT0gImRpc2FibGVkIikgewogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiTm8gbW9yZSB0byBkbyBEZXYgR0MiOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0zMDksNiArMzE0LDU3IEBACiAgICAgcmV0dXJuOwogfQogCitjbGFzcyBHY0NhbGxiYWNrIDogcHVibGljIElHYXJiYWdlQ29sbGVjdENhbGxiYWNrIHsKKyAgcHVibGljOgorICAgIFJldHVybjx2b2lkPiBvbkZpbmlzaChSZXN1bHQgcmVzdWx0KSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtUmVzdWx0ID0gcmVzdWx0OworICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICBtQ3Yubm90aWZ5X2FsbCgpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICB2b2lkIHdhaXQodWludDY0X3Qgc2Vjb25kcykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbUN2LndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKHNlY29uZHMpLCBbdGhpc10geyByZXR1cm4gbUZpbmlzaGVkOyB9KTsKKworICAgICAgICBpZiAoIW1GaW5pc2hlZCkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJEZXYgR0Mgb24gSEFMIHRpbWVvdXQiOworICAgICAgICB9IGVsc2UgaWYgKG1SZXN1bHQgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkRldiBHQyBvbiBIQUwgZmFpbGVkIHdpdGggIiA8PCB0b1N0cmluZyhtUmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRGV2IEdDIG9uIEhBTCBzdWNjZXNzZnVsIjsKKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DdjsKKyAgICBib29sIG1GaW5pc2hlZHtmYWxzZX07CisgICAgUmVzdWx0IG1SZXN1bHR7UmVzdWx0OjpVTktOT1dOX0VSUk9SfTsKK307CisKK3N0YXRpYyB2b2lkIHJ1bkRldkdjT25IYWwoc3A8SVN0b3JhZ2U+IHNlcnZpY2UpIHsKKyAgICBMT0coREVCVUcpIDw8ICJTdGFydCBEZXYgR0Mgb24gSEFMIjsKKyAgICBzcDxHY0NhbGxiYWNrPiBjYiA9IG5ldyBHY0NhbGxiYWNrKCk7CisgICAgYXV0byByZXQgPSBzZXJ2aWNlLT5nYXJiYWdlQ29sbGVjdChERVZHQ19USU1FT1VUX1NFQywgY2IpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgIkNhbm5vdCBzdGFydCBEZXYgR0Mgb24gSEFMOiAiIDw8IHJldC5kZXNjcmlwdGlvbigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNiLT53YWl0KERFVkdDX1RJTUVPVVRfU0VDKTsKK30KKworc3RhdGljIHZvaWQgcnVuRGV2R2Modm9pZCkgeworICAgIGF1dG8gc2VydmljZSA9IElTdG9yYWdlOjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBydW5EZXZHY09uSGFsKHNlcnZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZhbGxiYWNrIHRvIGxlZ2FjeSBjb2RlIHBhdGgKKyAgICAgICAgcnVuRGV2R2NGc3RhYigpOworICAgIH0KK30KKwogaW50IFJ1bklkbGVNYWludChjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbGsoY3ZfbSk7CiAgICAgaWYgKGlkbGVfbWFpbnRfc3RhdCAhPSBJZGxlTWFpbnRTdGF0czo6a1N0b3BwZWQpIHsKQEAgLTM2OSw4ICs0MjUsNyBAQAogICAgICAgICBjdl9hYm9ydC5ub3RpZnlfb25lKCk7CiAgICAgICAgIGxrLmxvY2soKTsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiYWJvcnRpbmcgaWRsZSBtYWludGVuYW5jZSI7Ci0gICAgICAgIGN2X3N0b3Aud2FpdChsaywgW117Ci0gICAgICAgICAgICByZXR1cm4gaWRsZV9tYWludF9zdGF0ID09IElkbGVNYWludFN0YXRzOjprU3RvcHBlZDt9KTsKKyAgICAgICAgY3Zfc3RvcC53YWl0KGxrLCBbXSB7IHJldHVybiBpZGxlX21haW50X3N0YXQgPT0gSWRsZU1haW50U3RhdHM6OmtTdG9wcGVkOyB9KTsKICAgICB9CiAgICAgbGsudW5sb2NrKCk7CiAKZGlmZiAtLWdpdCBhL0tleUJ1ZmZlci5jcHAgYi9LZXlCdWZmZXIuY3BwCmluZGV4IGU3YWVkZTUuLjU2MzNiZjggMTAwNjQ0Ci0tLSBhL0tleUJ1ZmZlci5jcHAKKysrIGIvS2V5QnVmZmVyLmNwcApAQCAtMzQsNCArMzQsMyBAQAogCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvS2V5QnVmZmVyLmggYi9LZXlCdWZmZXIuaAppbmRleCAyMDg3MTg3Li5hNjgzMTFmIDEwMDY0NAotLS0gYS9LZXlCdWZmZXIuaAorKysgYi9LZXlCdWZmZXIuaApAQCAtMzMsMTcgKzMzLDE1IEBACiAjZGVmaW5lIE9QVE5PTkUgX19hdHRyaWJ1dGVfXygob3B0aW1pemUoIk8wIikpKQogI2VuZGlmICAvLyBub3QgX19jbGFuZ19fCiBpbmxpbmUgT1BUTk9ORSB2b2lkKiBtZW1zZXRfcyh2b2lkKiBzLCBpbnQgYywgc2l6ZV90IG4pIHsKLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiBzOworICAgIGlmICghcykgcmV0dXJuIHM7CiAgICAgcmV0dXJuIG1lbXNldChzLCBjLCBuKTsKIH0KICN1bmRlZiBPUFROT05FCiAKIC8vIEFsbG9jYXRvciB0aGF0IGRlbGVnYXRlcyB1c2VmdWwgd29yayB0byBzdGFuZGFyZCBvbmUgYnV0IHplcm9lcyBkYXRhIGJlZm9yZSBkZWFsbG9jYXRpbmcuCiBjbGFzcyBaZXJvaW5nQWxsb2NhdG9yIDogcHVibGljIHN0ZDo6YWxsb2NhdG9yPGNoYXI+IHsKLSAgICBwdWJsaWM6Ci0gICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pCi0gICAgeworICBwdWJsaWM6CisgICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pIHsKICAgICAgICAgbWVtc2V0X3MocCwgMCwgbik7CiAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPGNoYXI+OjpkZWFsbG9jYXRlKHAsIG4pOwogICAgIH0KQEAgLTYwLDQgKzU4LDMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZgotCmRpZmYgLS1naXQgYS9LZXlTdG9yYWdlLmNwcCBiL0tleVN0b3JhZ2UuY3BwCmluZGV4IDA1MTg5MzAuLjAzNWM3YjcgMTAwNjQ0Ci0tLSBhL0tleVN0b3JhZ2UuY3BwCisrKyBiL0tleVN0b3JhZ2UuY3BwCkBAIC01NjgsNyArNTY4LDEwIEBACiAgICAgICAgIHN1Y2Nlc3MgJj0gZGVsZXRlS2V5KGRpcik7CiAgICAgfQogICAgIGF1dG8gc2VjZGlzY2FyZF9jbWQgPSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57Ci0gICAgICAgIGtTZWNkaXNjYXJkUGF0aCwgIi0tIiwgZGlyICsgIi8iICsga0ZuX2VuY3J5cHRlZF9rZXksIGRpciArICIvIiArIGtGbl9zZWNkaXNjYXJkYWJsZSwKKyAgICAgICAga1NlY2Rpc2NhcmRQYXRoLAorICAgICAgICAiLS0iLAorICAgICAgICBkaXIgKyAiLyIgKyBrRm5fZW5jcnlwdGVkX2tleSwKKyAgICAgICAgZGlyICsgIi8iICsga0ZuX3NlY2Rpc2NhcmRhYmxlLAogICAgIH07CiAgICAgaWYgKHVzZXNfa20pIHsKICAgICAgICAgc2VjZGlzY2FyZF9jbWQuZW1wbGFjZV9iYWNrKGRpciArICIvIiArIGtGbl9rZXltYXN0ZXJfa2V5X2Jsb2IpOwpkaWZmIC0tZ2l0IGEvS2V5VXRpbC5jcHAgYi9LZXlVdGlsLmNwcAppbmRleCA5ODg1NDQwLi5hMTdiOGIyIDEwMDY0NAotLS0gYS9LZXlVdGlsLmNwcAorKysgYi9LZXlVdGlsLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiS2V5VXRpbC5oIgogCisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxpb21hbmlwPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtMzIsMjIgKzMzLDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CiAKLS8vIGV4dDRlbmM6VE9ETyBnZXQgdGhpcyBjb25zdCBmcm9tIHNvbWV3aGVyZSBnb29kCi1jb25zdCBpbnQgRVhUNF9LRVlfREVTQ1JJUFRPUl9TSVpFID0gODsKLQotLy8gZXh0NGVuYzpUT0RPIEluY2x1ZGUgc3RydWN0dXJlIGZyb20gc29tZXdoZXJlIHNlbnNpYmxlCi0vLyBNVVNUIGJlIGluIHN5bmMgd2l0aCBleHQ0X2NyeXB0by5jIGluIGtlcm5lbAotY29uc3RleHByIGludCBFWFQ0X0VOQ1JZUFRJT05fTU9ERV9BRVNfMjU2X1hUUyA9IDE7Ci1jb25zdGV4cHIgaW50IEVYVDRfQUVTXzI1Nl9YVFNfS0VZX1NJWkUgPSA2NDsKLWNvbnN0ZXhwciBpbnQgRVhUNF9NQVhfS0VZX1NJWkUgPSA2NDsKLXN0cnVjdCBleHQ0X2VuY3J5cHRpb25fa2V5IHsKLSAgICB1aW50MzJfdCBtb2RlOwotICAgIGNoYXIgcmF3W0VYVDRfTUFYX0tFWV9TSVpFXTsKLSAgICB1aW50MzJfdCBzaXplOwotfTsKK2NvbnN0ZXhwciBpbnQgRlNfQUVTXzI1Nl9YVFNfS0VZX1NJWkUgPSA2NDsKIAogYm9vbCByYW5kb21LZXkoS2V5QnVmZmVyKiBrZXkpIHsKLSAgICAqa2V5ID0gS2V5QnVmZmVyKEVYVDRfQUVTXzI1Nl9YVFNfS0VZX1NJWkUpOworICAgICprZXkgPSBLZXlCdWZmZXIoRlNfQUVTXzI1Nl9YVFNfS0VZX1NJWkUpOwogICAgIGlmIChSZWFkUmFuZG9tQnl0ZXMoa2V5LT5zaXplKCksIGtleS0+ZGF0YSgpKSAhPSAwKSB7CiAgICAgICAgIC8vIFRPRE8gc3RhdHVzX3QgcGxheXMgYmFkbHkgd2l0aCBQTE9HLCBmaXggaXQuCiAgICAgICAgIExPRyhFUlJPUikgPDwgIlJhbmRvbSByZWFkIGZhaWxlZCI7CkBAIC01Nyw3ICs0Niw3IEBACiB9CiAKIC8vIEdldCByYXcga2V5cmVmIC0gdXNlZCB0byBtYWtlIGtleW5hbWUgYW5kIHRvIHBhc3MgdG8gaW9jdGwKLXN0YXRpYyBzdGQ6OnN0cmluZyBnZW5lcmF0ZUtleVJlZihjb25zdCBjaGFyKiBrZXksIGludCBsZW5ndGgpIHsKK3N0YXRpYyBzdGQ6OnN0cmluZyBnZW5lcmF0ZUtleVJlZihjb25zdCB1aW50OF90KiBrZXksIGludCBsZW5ndGgpIHsKICAgICBTSEE1MTJfQ1RYIGM7CiAKICAgICBTSEE1MTJfSW5pdCgmYyk7CkBAIC03MCwzMCArNTksMjQgQEAKICAgICB1bnNpZ25lZCBjaGFyIGtleV9yZWYyW1NIQTUxMl9ESUdFU1RfTEVOR1RIXTsKICAgICBTSEE1MTJfRmluYWwoa2V5X3JlZjIsICZjKTsKIAotICAgIHN0YXRpY19hc3NlcnQoRVhUNF9LRVlfREVTQ1JJUFRPUl9TSVpFIDw9IFNIQTUxMl9ESUdFU1RfTEVOR1RILAotICAgICAgICAgICAgICAgICAgIkhhc2ggdG9vIHNob3J0IGZvciBkZXNjcmlwdG9yIik7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilrZXlfcmVmMiwgRVhUNF9LRVlfREVTQ1JJUFRPUl9TSVpFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEZTX0tFWV9ERVNDUklQVE9SX1NJWkUgPD0gU0hBNTEyX0RJR0VTVF9MRU5HVEgsICJIYXNoIHRvbyBzaG9ydCBmb3IgZGVzY3JpcHRvciIpOworICAgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopa2V5X3JlZjIsIEZTX0tFWV9ERVNDUklQVE9SX1NJWkUpOwogfQogCi1zdGF0aWMgYm9vbCBmaWxsS2V5KGNvbnN0IEtleUJ1ZmZlciYga2V5LCBleHQ0X2VuY3J5cHRpb25fa2V5KiBleHQ0X2tleSkgewotICAgIGlmIChrZXkuc2l6ZSgpICE9IEVYVDRfQUVTXzI1Nl9YVFNfS0VZX1NJWkUpIHsKK3N0YXRpYyBib29sIGZpbGxLZXkoY29uc3QgS2V5QnVmZmVyJiBrZXksIGZzY3J5cHRfa2V5KiBmc19rZXkpIHsKKyAgICBpZiAoa2V5LnNpemUoKSAhPSBGU19BRVNfMjU2X1hUU19LRVlfU0laRSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJXcm9uZyBzaXplIGtleSAiIDw8IGtleS5zaXplKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgc3RhdGljX2Fzc2VydChFWFQ0X0FFU18yNTZfWFRTX0tFWV9TSVpFIDw9IHNpemVvZihleHQ0X2tleS0+cmF3KSwgIktleSB0b28gbG9uZyEiKTsKLSAgICBleHQ0X2tleS0+bW9kZSA9IEVYVDRfRU5DUllQVElPTl9NT0RFX0FFU18yNTZfWFRTOwotICAgIGV4dDRfa2V5LT5zaXplID0ga2V5LnNpemUoKTsKLSAgICBtZW1zZXQoZXh0NF9rZXktPnJhdywgMCwgc2l6ZW9mKGV4dDRfa2V5LT5yYXcpKTsKLSAgICBtZW1jcHkoZXh0NF9rZXktPnJhdywga2V5LmRhdGEoKSwga2V5LnNpemUoKSk7CisgICAgc3RhdGljX2Fzc2VydChGU19BRVNfMjU2X1hUU19LRVlfU0laRSA8PSBzaXplb2YoZnNfa2V5LT5yYXcpLCAiS2V5IHRvbyBsb25nISIpOworICAgIGZzX2tleS0+bW9kZSA9IEZTX0VOQ1JZUFRJT05fTU9ERV9BRVNfMjU2X1hUUzsKKyAgICBmc19rZXktPnNpemUgPSBrZXkuc2l6ZSgpOworICAgIG1lbXNldChmc19rZXktPnJhdywgMCwgc2l6ZW9mKGZzX2tleS0+cmF3KSk7CisgICAgbWVtY3B5KGZzX2tleS0+cmF3LCBrZXkuZGF0YSgpLCBrZXkuc2l6ZSgpKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGNoYXIgY29uc3QqIGNvbnN0IE5BTUVfUFJFRklYRVNbXSA9IHsKLSAgICAiZXh0NCIsCi0gICAgImYyZnMiLAotICAgICJmc2NyeXB0IiwKLSAgICBudWxscHRyCi19Oworc3RhdGljIGNoYXIgY29uc3QqIGNvbnN0IE5BTUVfUFJFRklYRVNbXSA9IHsiZXh0NCIsICJmMmZzIiwgImZzY3J5cHQiLCBudWxscHRyfTsKIAogc3RhdGljIHN0ZDo6c3RyaW5nIGtleW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd19yZWYpIHsKICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKQEAgLTEwNSw4ICs4OCw4IEBACiB9CiAKIC8vIEdldCB0aGUga2V5cmluZyB3ZSBzdG9yZSBhbGwga2V5cyBpbgotc3RhdGljIGJvb2wgZTRjcnlwdEtleXJpbmcoa2V5X3NlcmlhbF90KiBkZXZpY2Vfa2V5cmluZykgewotICAgICpkZXZpY2Vfa2V5cmluZyA9IGtleWN0bF9zZWFyY2goS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAia2V5cmluZyIsICJlNGNyeXB0IiwgMCk7CitzdGF0aWMgYm9vbCBmc2NyeXB0S2V5cmluZyhrZXlfc2VyaWFsX3QqIGRldmljZV9rZXlyaW5nKSB7CisgICAgKmRldmljZV9rZXlyaW5nID0ga2V5Y3RsX3NlYXJjaChLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsICJrZXlyaW5nIiwgImZzY3J5cHQiLCAwKTsKICAgICBpZiAoKmRldmljZV9rZXlyaW5nID09IC0xKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZmluZCBkZXZpY2Uga2V5cmluZyI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTExNywxOCArMTAwLDE4IEBACiAvLyBJbnN0YWxsIHBhc3N3b3JkIGludG8gZ2xvYmFsIGtleXJpbmcKIC8vIFJldHVybiByYXcga2V5IHJlZmVyZW5jZSBmb3IgdXNlIGluIHBvbGljeQogYm9vbCBpbnN0YWxsS2V5KGNvbnN0IEtleUJ1ZmZlciYga2V5LCBzdGQ6OnN0cmluZyogcmF3X3JlZikgewotICAgIC8vIFBsYWNlIGV4dDRfZW5jcnlwdGlvbl9rZXkgaW50byBhdXRvbWF0aWNhbGx5IHplcm9pbmcgYnVmZmVyLgotICAgIEtleUJ1ZmZlciBleHQ0S2V5QnVmZmVyKHNpemVvZihleHQ0X2VuY3J5cHRpb25fa2V5KSk7Ci0gICAgZXh0NF9lbmNyeXB0aW9uX2tleSAmZXh0NF9rZXkgPSAqcmVpbnRlcnByZXRfY2FzdDxleHQ0X2VuY3J5cHRpb25fa2V5Kj4oZXh0NEtleUJ1ZmZlci5kYXRhKCkpOworICAgIC8vIFBsYWNlIGZzY3J5cHRfa2V5IGludG8gYXV0b21hdGljYWxseSB6ZXJvaW5nIGJ1ZmZlci4KKyAgICBLZXlCdWZmZXIgZnNLZXlCdWZmZXIoc2l6ZW9mKGZzY3J5cHRfa2V5KSk7CisgICAgZnNjcnlwdF9rZXkmIGZzX2tleSA9ICpyZWludGVycHJldF9jYXN0PGZzY3J5cHRfa2V5Kj4oZnNLZXlCdWZmZXIuZGF0YSgpKTsKIAotICAgIGlmICghZmlsbEtleShrZXksICZleHQ0X2tleSkpIHJldHVybiBmYWxzZTsKLSAgICAqcmF3X3JlZiA9IGdlbmVyYXRlS2V5UmVmKGV4dDRfa2V5LnJhdywgZXh0NF9rZXkuc2l6ZSk7CisgICAgaWYgKCFmaWxsS2V5KGtleSwgJmZzX2tleSkpIHJldHVybiBmYWxzZTsKKyAgICAqcmF3X3JlZiA9IGdlbmVyYXRlS2V5UmVmKGZzX2tleS5yYXcsIGZzX2tleS5zaXplKTsKICAgICBrZXlfc2VyaWFsX3QgZGV2aWNlX2tleXJpbmc7Ci0gICAgaWYgKCFlNGNyeXB0S2V5cmluZygmZGV2aWNlX2tleXJpbmcpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFmc2NyeXB0S2V5cmluZygmZGV2aWNlX2tleXJpbmcpKSByZXR1cm4gZmFsc2U7CiAgICAgZm9yIChjaGFyIGNvbnN0KiBjb25zdCogbmFtZV9wcmVmaXggPSBOQU1FX1BSRUZJWEVTOyAqbmFtZV9wcmVmaXggIT0gbnVsbHB0cjsgbmFtZV9wcmVmaXgrKykgewogICAgICAgICBhdXRvIHJlZiA9IGtleW5hbWUoKm5hbWVfcHJlZml4LCAqcmF3X3JlZik7CiAgICAgICAgIGtleV9zZXJpYWxfdCBrZXlfaWQgPQotICAgICAgICAgICAgYWRkX2tleSgibG9nb24iLCByZWYuY19zdHIoKSwgKHZvaWQqKSZleHQ0X2tleSwgc2l6ZW9mKGV4dDRfa2V5KSwgZGV2aWNlX2tleXJpbmcpOworICAgICAgICAgICAgYWRkX2tleSgibG9nb24iLCByZWYuY19zdHIoKSwgKHZvaWQqKSZmc19rZXksIHNpemVvZihmc19rZXkpLCBkZXZpY2Vfa2V5cmluZyk7CiAgICAgICAgIGlmIChrZXlfaWQgPT0gLTEpIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5zZXJ0IGtleSBpbnRvIGtleXJpbmcgIiA8PCBkZXZpY2Vfa2V5cmluZzsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE0MSw3ICsxMjQsNyBAQAogCiBib29sIGV2aWN0S2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdfcmVmKSB7CiAgICAga2V5X3NlcmlhbF90IGRldmljZV9rZXlyaW5nOwotICAgIGlmICghZTRjcnlwdEtleXJpbmcoJmRldmljZV9rZXlyaW5nKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghZnNjcnlwdEtleXJpbmcoJmRldmljZV9rZXlyaW5nKSkgcmV0dXJuIGZhbHNlOwogICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAgICAgZm9yIChjaGFyIGNvbnN0KiBjb25zdCogbmFtZV9wcmVmaXggPSBOQU1FX1BSRUZJWEVTOyAqbmFtZV9wcmVmaXggIT0gbnVsbHB0cjsgbmFtZV9wcmVmaXgrKykgewogICAgICAgICBhdXRvIHJlZiA9IGtleW5hbWUoKm5hbWVfcHJlZml4LCByYXdfcmVmKTsKQEAgLTE3MCw4ICsxNTMsOCBAQAogICAgICAgICBpZiAoIXJldHJpZXZlS2V5KGtleV9wYXRoLCBrZXlfYXV0aGVudGljYXRpb24sICZrZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFjcmVhdGVfaWZfYWJzZW50KSB7Ci0gICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGtleSBmb3VuZCBpbiAiIDw8IGtleV9wYXRoOwotICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBrZXkgZm91bmQgaW4gIiA8PCBrZXlfcGF0aDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIG5ldyBrZXkgaW4gIiA8PCBrZXlfcGF0aDsKICAgICAgICAgaWYgKCFyYW5kb21LZXkoJmtleSkpIHJldHVybiBmYWxzZTsKQEAgLTE4NSwyMCArMTY4LDE5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgcmV0cmlldmVLZXkoYm9vbCBjcmVhdGVfaWZfYWJzZW50LCBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3BhdGgsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0bXBfcGF0aCwgS2V5QnVmZmVyKiBrZXkpIHsKK2Jvb2wgcmV0cmlldmVLZXkoYm9vbCBjcmVhdGVfaWZfYWJzZW50LCBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0bXBfcGF0aCwKKyAgICAgICAgICAgICAgICAgS2V5QnVmZmVyKiBrZXkpIHsKICAgICBpZiAocGF0aEV4aXN0cyhrZXlfcGF0aCkpIHsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiS2V5IGV4aXN0cywgdXNpbmc6ICIgPDwga2V5X3BhdGg7CiAgICAgICAgIGlmICghcmV0cmlldmVLZXkoa2V5X3BhdGgsIGtFbXB0eUF1dGhlbnRpY2F0aW9uLCBrZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFjcmVhdGVfaWZfYWJzZW50KSB7Ci0gICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGtleSBmb3VuZCBpbiAiIDw8IGtleV9wYXRoOwotICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBrZXkgZm91bmQgaW4gIiA8PCBrZXlfcGF0aDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIG5ldyBrZXkgaW4gIiA8PCBrZXlfcGF0aDsKICAgICAgICAgaWYgKCFyYW5kb21LZXkoa2V5KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIXN0b3JlS2V5QXRvbWljYWxseShrZXlfcGF0aCwgdG1wX3BhdGgsCi0gICAgICAgICAgICAgICAga0VtcHR5QXV0aGVudGljYXRpb24sICprZXkpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghc3RvcmVLZXlBdG9taWNhbGx5KGtleV9wYXRoLCB0bXBfcGF0aCwga0VtcHR5QXV0aGVudGljYXRpb24sICprZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvS2V5VXRpbC5oIGIvS2V5VXRpbC5oCmluZGV4IGE4NWVjYTEuLmI0MTE1ZjQgMTAwNjQ0Ci0tLSBhL0tleVV0aWwuaAorKysgYi9LZXlVdGlsLmgKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlICJLZXlCdWZmZXIuaCIKICNpbmNsdWRlICJLZXlTdG9yYWdlLmgiCiAKLSNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewpAQCAtMzIsOCArMzIsOCBAQAogYm9vbCByZXRyaWV2ZUFuZEluc3RhbGxLZXkoYm9vbCBjcmVhdGVfaWZfYWJzZW50LCBjb25zdCBLZXlBdXRoZW50aWNhdGlvbiYga2V5X2F1dGhlbnRpY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9wYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgdG1wX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyoga2V5X3JlZik7Ci1ib29sIHJldHJpZXZlS2V5KGJvb2wgY3JlYXRlX2lmX2Fic2VudCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9wYXRoLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG1wX3BhdGgsIEtleUJ1ZmZlcioga2V5KTsKK2Jvb2wgcmV0cmlldmVLZXkoYm9vbCBjcmVhdGVfaWZfYWJzZW50LCBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0bXBfcGF0aCwKKyAgICAgICAgICAgICAgICAgS2V5QnVmZmVyKiBrZXkpOwogCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL0xvb3AuY3BwIGIvTG9vcC5jcHAKaW5kZXggMzM1Y2ExMy4uNDkyNmVhOCAxMDA2NDQKLS0tIGEvTG9vcC5jcHAKKysrIGIvTG9vcC5jcHAKQEAgLTE2LDI0ICsxNiwyNCBAQAogCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19QQUNLQUdFX01BTkFHRVIKIAorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPHN5cy9tb3VudC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCkBAIC03OSw3ICs3OSw3IEBACiAKICAgICBzdHJ1Y3QgbG9vcF9pbmZvNjQgbGk7CiAgICAgbWVtc2V0KCZsaSwgMCwgc2l6ZW9mKGxpKSk7Ci0gICAgc3RybGNweSgoY2hhciopIGxpLmxvX2NyeXB0X25hbWUsIGtWb2xkUHJlZml4LCBMT19OQU1FX1NJWkUpOworICAgIHN0cmxjcHkoKGNoYXIqKWxpLmxvX2NyeXB0X25hbWUsIGtWb2xkUHJlZml4LCBMT19OQU1FX1NJWkUpOwogICAgIGlmIChpb2N0bChkZXZpY2VfZmQuZ2V0KCksIExPT1BfU0VUX1NUQVRVUzY0LCAmbGkpID09IC0xKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gTE9PUF9TRVRfU1RBVFVTNjQiOwogICAgICAgICByZXR1cm4gLWVycm5vOwpAQCAtODgsNyArODgsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgTG9vcDo6ZGVzdHJveUJ5RGV2aWNlKGNvbnN0IGNoYXIgKmxvb3BEZXZpY2UpIHsKK2ludCBMb29wOjpkZXN0cm95QnlEZXZpY2UoY29uc3QgY2hhciogbG9vcERldmljZSkgewogICAgIGludCBkZXZpY2VfZmQ7CiAKICAgICBkZXZpY2VfZmQgPSBvcGVuKGxvb3BEZXZpY2UsIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBhdXRvIGlkID0gc3RkOjpzdHJpbmcoKGNoYXIqKSBsaS5sb19jcnlwdF9uYW1lKTsKKyAgICAgICAgYXV0byBpZCA9IHN0ZDo6c3RyaW5nKChjaGFyKilsaS5sb19jcnlwdF9uYW1lKTsKICAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoaWQsIGtWb2xkUHJlZml4KSkgewogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiVGVhcmluZyBkb3duIHN0YWxlIGxvb3AgZGV2aWNlIGF0ICIgPDwgcGF0aCA8PCAiIG5hbWVkICIgPDwgaWQ7CiAKQEAgLTE0NiwxNCArMTQ2LDE0IEBACiAgICAgICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIExPT1BfQ0xSX0ZEICIgPDwgcGF0aDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiRm91bmQgdW5tYW5hZ2VkIGxvb3AgZGV2aWNlIGF0ICIgPDwgcGF0aCA8PCAiIG5hbWVkICIgPDwgaWQ7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJGb3VuZCB1bm1hbmFnZWQgbG9vcCBkZXZpY2UgYXQgIiA8PCBwYXRoIDw8ICIgbmFtZWQgIiA8PCBpZDsKICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1pbnQgTG9vcDo6Y3JlYXRlSW1hZ2VGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycykgeworaW50IExvb3A6OmNyZWF0ZUltYWdlRmlsZShjb25zdCBjaGFyKiBmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpIHsKICAgICB1bmlxdWVfZmQgZmQob3BlbihmaWxlLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKSk7CiAgICAgaWYgKGZkLmdldCgpID09IC0xKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGltYWdlICIgPDwgZmlsZTsKQEAgLTE2OSw3ICsxNjksNyBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgTG9vcDo6cmVzaXplSW1hZ2VGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycykgeworaW50IExvb3A6OnJlc2l6ZUltYWdlRmlsZShjb25zdCBjaGFyKiBmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpIHsKICAgICBpbnQgZmQ7CiAKICAgICBpZiAoKGZkID0gb3BlbihmaWxlLCBPX1JEV1IgfCBPX0NMT0VYRUMpKSA8IDApIHsKZGlmZiAtLWdpdCBhL0xvb3AuaCBiL0xvb3AuaAppbmRleCAxMzBjNWI2Li40ZTVmOWMxIDEwMDY0NAotLS0gYS9Mb29wLmgKKysrIGIvTG9vcC5oCkBAIC0xNywxOSArMTcsMjAgQEAKICNpZm5kZWYgX0xPT1BfSAogI2RlZmluZSBfTE9PUF9ICiAKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9vcC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZz4KIAogY2xhc3MgTG9vcCB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBzdGF0aWMgY29uc3QgaW50IExPT1BfTUFYID0gNDA5NjsKLXB1YmxpYzoKKworICBwdWJsaWM6CiAgICAgc3RhdGljIGludCBjcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUsIHN0ZDo6c3RyaW5nJiBvdXRfZGV2aWNlKTsKLSAgICBzdGF0aWMgaW50IGRlc3Ryb3lCeURldmljZShjb25zdCBjaGFyICpsb29wRGV2aWNlKTsKKyAgICBzdGF0aWMgaW50IGRlc3Ryb3lCeURldmljZShjb25zdCBjaGFyKiBsb29wRGV2aWNlKTsKICAgICBzdGF0aWMgaW50IGRlc3Ryb3lBbGwoKTsKLSAgICBzdGF0aWMgaW50IGNyZWF0ZUltYWdlRmlsZShjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpOwotICAgIHN0YXRpYyBpbnQgcmVzaXplSW1hZ2VGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycyk7CisgICAgc3RhdGljIGludCBjcmVhdGVJbWFnZUZpbGUoY29uc3QgY2hhciogZmlsZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKTsKKyAgICBzdGF0aWMgaW50IHJlc2l6ZUltYWdlRmlsZShjb25zdCBjaGFyKiBmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9NZXRhZGF0YUNyeXB0LmNwcCBiL01ldGFkYXRhQ3J5cHQuY3BwCmluZGV4IGMxNGI5YTIuLmUxNTY0MjQgMTAwNjQ0Ci0tLSBhL01ldGFkYXRhQ3J5cHQuY3BwCisrKyBiL01ldGFkYXRhQ3J5cHQuY3BwCkBAIC0xNCwxMyArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJLZXlCdWZmZXIuaCIKICNpbmNsdWRlICJNZXRhZGF0YUNyeXB0LmgiCisjaW5jbHVkZSAiS2V5QnVmZmVyLmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHRocmVhZD4KICNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KQEAgLTM2LDEyICszNiwxMyBAQAogI2luY2x1ZGUgPGN1dGlscy9mcy5oPgogI2luY2x1ZGUgPGZzX21nci5oPgogCisjaW5jbHVkZSAiQ2hlY2twb2ludC5oIgogI2luY2x1ZGUgIkVuY3J5cHRJbnBsYWNlLmgiCiAjaW5jbHVkZSAiS2V5U3RvcmFnZS5oIgogI2luY2x1ZGUgIktleVV0aWwuaCIKLSNpbmNsdWRlICJzZWNvbnRleHQuaCIKICNpbmNsdWRlICJVdGlscy5oIgogI2luY2x1ZGUgIlZvbGRVdGlsLmgiCisjaW5jbHVkZSAic2Vjb250ZXh0LmgiCiAKICNkZWZpbmUgRE1fQ1JZUFRfQlVGX1NJWkUgNDA5NgogI2RlZmluZSBUQUJMRV9MT0FEX1JFVFJJRVMgMTAKQEAgLTU5LDcgKzYwLDggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBhdXRvIG1vdW50X3JjID0gZnNfbWdyX2RvX21vdW50KGZzdGFiX2RlZmF1bHQsIGNvbnN0X2Nhc3Q8Y2hhcio+KG1vdW50X3BvaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KGJsa19kZXZpY2UpLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KGJsa19kZXZpY2UpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6Y3BfbmVlZHNDaGVja3BvaW50KCkpOwogICAgIGlmIChzZXRleGVjY29uKG51bGxwdHIpKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY2xlYXIgc2V0ZXhlY2NvbiI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTk5LDMzICsxMDEsMjIgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgYm9vbCBnZXRfbnVtYmVyX29mX3NlY3RvcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHJlYWxfYmxrZGV2LCB1aW50NjRfdCAqbnJfc2VjKSB7Ci0gICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGRldl9mZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbigKLSAgICAgICAgcmVhbF9ibGtkZXYuY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMsIDApKSk7Ci0gICAgaWYgKGRldl9mZCA9PSAtMSkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG9wZW4gIiA8PCByZWFsX2Jsa2RldiA8PCAiIHRvIG1lYXN1cmUgc2l6ZSI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgdW5zaWduZWQgbG9uZyByZXM7Ci0gICAgLy8gVE9ETzogc2hvdWxkIHVzZSBCTEtHRVRTSVpFNjQKLSAgICBnZXRfYmxrZGV2X3NpemUoZGV2X2ZkLmdldCgpLCAmcmVzKTsKLSAgICBpZiAocmVzID09IDApIHsKK3N0YXRpYyBib29sIGdldF9udW1iZXJfb2Zfc2VjdG9ycyhjb25zdCBzdGQ6OnN0cmluZyYgcmVhbF9ibGtkZXYsIHVpbnQ2NF90KiBucl9zZWMpIHsKKyAgICBpZiAoYW5kcm9pZDo6dm9sZDo6R2V0QmxvY2tEZXY1MTJTZWN0b3JzKHJlYWxfYmxrZGV2LCBucl9zZWMpICE9IGFuZHJvaWQ6Ok9LKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gbWVhc3VyZSBzaXplIG9mICIgPDwgcmVhbF9ibGtkZXY7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgKm5yX3NlYyA9IHJlczsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBkbV9pb2N0bCogZG1faW9jdGxfaW5pdChjaGFyICpidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRtX25hbWUpIHsKK3N0YXRpYyBzdHJ1Y3QgZG1faW9jdGwqIGRtX2lvY3RsX2luaXQoY2hhciogYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9uYW1lKSB7CiAgICAgaWYgKGJ1ZmZlcl9zaXplIDwgc2l6ZW9mKGRtX2lvY3RsKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJkbV9pb2N0bCBidWZmZXIgdG9vIHNtYWxsIjsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCiAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgYnVmZmVyX3NpemUpOwotICAgIHN0cnVjdCBkbV9pb2N0bCogaW8gPSAoc3RydWN0IGRtX2lvY3RsKikgYnVmZmVyOworICAgIHN0cnVjdCBkbV9pb2N0bCogaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CiAgICAgaW8tPmRhdGFfc2l6ZSA9IGJ1ZmZlcl9zaXplOwogICAgIGlvLT5kYXRhX3N0YXJ0ID0gc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCk7CiAgICAgaW8tPnZlcnNpb25bMF0gPSA0OwpAQCAtMTM5LDggKzEzMCw4IEBACiBzdGF0aWMgYm9vbCBjcmVhdGVfY3J5cHRvX2Jsa19kZXYoY29uc3Qgc3RkOjpzdHJpbmcmIGRtX25hbWUsIHVpbnQ2NF90IG5yX3NlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X3R5cGUsIGNvbnN0IEtleUJ1ZmZlciYgY3J5cHRfcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBjcnlwdG9fYmxrZGV2KSB7Ci0gICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGRtX2ZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKAotICAgICAgICAiL2Rldi9kZXZpY2UtbWFwcGVyIiwgT19SRFdSIHwgT19DTE9FWEVDLCAwKSkpOworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBkbV9mZCgKKyAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oIi9kZXYvZGV2aWNlLW1hcHBlciIsIE9fUkRXUiB8IE9fQ0xPRVhFQywgMCkpKTsKICAgICBpZiAoZG1fZmQgPT0gLTEpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNhbm5vdCBvcGVuIGRldmljZS1tYXBwZXIiOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNTgsMTMgKzE0OSwxMyBAQAogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJldHJpZXZlIGRtLWNyeXB0IGRldmljZSBzdGF0dXMgIiA8PCBkbV9uYW1lOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgICpjcnlwdG9fYmxrZGV2ID0gc3RkOjpzdHJpbmcoKSArICIvZGV2L2Jsb2NrL2RtLSIgKyBzdGQ6OnRvX3N0cmluZygKLSAgICAgICAgKGlvLT5kZXYgJiAweGZmKSB8ICgoaW8tPmRldiA+PiAxMikgJiAweGZmZjAwKSk7CisgICAgKmNyeXB0b19ibGtkZXYgPSBzdGQ6OnN0cmluZygpICsgIi9kZXYvYmxvY2svZG0tIiArCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZygoaW8tPmRldiAmIDB4ZmYpIHwgKChpby0+ZGV2ID4+IDEyKSAmIDB4ZmZmMDApKTsKIAogICAgIGlvID0gZG1faW9jdGxfaW5pdChidWZmZXIsIHNpemVvZihidWZmZXIpLCBkbV9uYW1lKTsKICAgICBzaXplX3QgcGFyYW1peCA9IGlvLT5kYXRhX3N0YXJ0ICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYyk7CiAgICAgc2l6ZV90IG51bGxpeCA9IHBhcmFtaXggKyBjcnlwdF9wYXJhbXMuc2l6ZSgpOwotICAgIHNpemVfdCBlbmRpeCA9IChudWxsaXggKyAxICsgNykgJiA4OyAvLyBBZGQgcm9vbSBmb3IgXDAgYW5kIGFsaWduIHRvIDggYnl0ZSBib3VuZGFyeQorICAgIHNpemVfdCBlbmRpeCA9IChudWxsaXggKyAxICsgNykgJiA4OyAgLy8gQWRkIHJvb20gZm9yIFwwIGFuZCBhbGlnbiB0byA4IGJ5dGUgYm91bmRhcnkKIAogICAgIGlmIChlbmRpeCA+IHNpemVvZihidWZmZXIpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgImNyeXB0X3BhcmFtcyB0b28gYmlnIGZvciBETV9DUllQVF9CVUZfU0laRSI7CkBAIC0xNzIsMjEgKzE2MywyMSBAQAogICAgIH0KIAogICAgIGlvLT50YXJnZXRfY291bnQgPSAxOwotICAgIGF1dG8gdGd0ID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqKSAoYnVmZmVyICsgaW8tPmRhdGFfc3RhcnQpOworICAgIGF1dG8gdGd0ID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyopKGJ1ZmZlciArIGlvLT5kYXRhX3N0YXJ0KTsKICAgICB0Z3QtPnN0YXR1cyA9IDA7CiAgICAgdGd0LT5zZWN0b3Jfc3RhcnQgPSAwOwogICAgIHRndC0+bGVuZ3RoID0gbnJfc2VjOwogICAgIHRhcmdldF90eXBlLmNvcHkodGd0LT50YXJnZXRfdHlwZSwgc2l6ZW9mKHRndC0+dGFyZ2V0X3R5cGUpKTsKICAgICBtZW1jcHkoYnVmZmVyICsgcGFyYW1peCwgY3J5cHRfcGFyYW1zLmRhdGEoKSwKLSAgICAgICAgICAgIHN0ZDo6bWluKGNyeXB0X3BhcmFtcy5zaXplKCksIHNpemVvZihidWZmZXIpIC0gcGFyYW1peCkpOworICAgICAgICAgICBzdGQ6Om1pbihjcnlwdF9wYXJhbXMuc2l6ZSgpLCBzaXplb2YoYnVmZmVyKSAtIHBhcmFtaXgpKTsKICAgICBidWZmZXJbbnVsbGl4XSA9ICdcMCc7CiAgICAgdGd0LT5uZXh0ID0gZW5kaXg7CiAKLSAgICBmb3IgKGludCBpID0gMDsgOyBpKyspIHsKKyAgICBmb3IgKGludCBpID0gMDs7IGkrKykgewogICAgICAgICBpZiAoaW9jdGwoZG1fZmQuZ2V0KCksIERNX1RBQkxFX0xPQUQsIGlvKSA9PSAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoaSsxID49IFRBQkxFX0xPQURfUkVUUklFUykgeworICAgICAgICBpZiAoaSArIDEgPj0gVEFCTEVfTE9BRF9SRVRSSUVTKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRE1fVEFCTEVfTE9BRCBpb2N0bCBmYWlsZWQiOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yMDMsMTEgKzE5NCwxMSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIGU0Y3J5cHRfbW91bnRfbWV0YWRhdGFfZW5jcnlwdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwgYm9vbCBuZWVkc19lbmNyeXB0KSB7Ci0gICAgTE9HKERFQlVHKSA8PCAiZTRjcnlwdF9tb3VudF9tZXRhZGF0YV9lbmNyeXB0ZWQ6ICIgPDwgbW91bnRfcG9pbnQgPDwgIiAiIDw8IG5lZWRzX2VuY3J5cHQ7Citib29sIGZzY3J5cHRfbW91bnRfbWV0YWRhdGFfZW5jcnlwdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwgYm9vbCBuZWVkc19lbmNyeXB0KSB7CisgICAgTE9HKERFQlVHKSA8PCAiZnNjcnlwdF9tb3VudF9tZXRhZGF0YV9lbmNyeXB0ZWQ6ICIgPDwgbW91bnRfcG9pbnQgPDwgIiAiIDw8IG5lZWRzX2VuY3J5cHQ7CiAgICAgYXV0byBlbmNyeXB0ZWRfc3RhdGUgPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8uY3J5cHRvLnN0YXRlIiwgIiIpOwogICAgIGlmIChlbmNyeXB0ZWRfc3RhdGUgIT0gIiIpIHsKLSAgICAgICAgTE9HKERFQlVHKSA8PCAiZTRjcnlwdF9lbmFibGVfY3J5cHRvIGdvdCB1bmV4cGVjdGVkIHN0YXJ0aW5nIHN0YXRlOiAiIDw8IGVuY3J5cHRlZF9zdGF0ZTsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiZnNjcnlwdF9lbmFibGVfY3J5cHRvIGdvdCB1bmV4cGVjdGVkIHN0YXJ0aW5nIHN0YXRlOiAiIDw8IGVuY3J5cHRlZF9zdGF0ZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBhdXRvIGRhdGFfcmVjID0gZnNfbWdyX2dldF9lbnRyeV9mb3JfbW91bnRfcG9pbnQoZnN0YWJfZGVmYXVsdCwgbW91bnRfcG9pbnQpOwpkaWZmIC0tZ2l0IGEvTWV0YWRhdGFDcnlwdC5oIGIvTWV0YWRhdGFDcnlwdC5oCmluZGV4IDg0MWRjOTcuLmQ4MmE0M2IgMTAwNjQ0Ci0tLSBhL01ldGFkYXRhQ3J5cHQuaAorKysgYi9NZXRhZGF0YUNyeXB0LmgKQEAgLTE5LDYgKzE5LDYgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KIAotYm9vbCBlNGNyeXB0X21vdW50X21ldGFkYXRhX2VuY3J5cHRlZChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQsIGJvb2wgbmVlZHNfZW5jcnlwdCk7Citib29sIGZzY3J5cHRfbW91bnRfbWV0YWRhdGFfZW5jcnlwdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwgYm9vbCBuZWVkc19lbmNyeXB0KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb3ZlU3RvcmFnZS5jcHAgYi9Nb3ZlU3RvcmFnZS5jcHAKaW5kZXggNDYyNDAyNi4uNDY1M2UwMSAxMDA2NDQKLS0tIGEvTW92ZVN0b3JhZ2UuY3BwCisrKyBiL01vdmVTdG9yYWdlLmNwcApAQCAtMjksNyArMjksOCBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKLSNkZWZpbmUgQ09OU1RSQUlOKGFtb3VudCwgbG93LCBoaWdoKSAoKGFtb3VudCkgPCAobG93KSA/IChsb3cpIDogKChhbW91bnQpID4gKGhpZ2gpID8gKGhpZ2gpIDogKGFtb3VudCkpKQorI2RlZmluZSBDT05TVFJBSU4oYW1vdW50LCBsb3csIGhpZ2gpIFwKKyAgICAoKGFtb3VudCkgPCAobG93KSA/IChsb3cpIDogKChhbW91bnQpID4gKGhpZ2gpID8gKGhpZ2gpIDogKGFtb3VudCkpKQogCiBzdGF0aWMgY29uc3QgY2hhcioga1Byb3BCbG9ja2luZ0V4ZWMgPSAicGVyc2lzdC5zeXMuYmxvY2tpbmdfZXhlYyI7CiAKQEAgLTQ4LDcgKzQ5LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyKiBrV2FrZUxvY2sgPSAiTW92ZVRhc2siOwogCiBzdGF0aWMgdm9pZCBub3RpZnlQcm9ncmVzcyhpbnQgcHJvZ3Jlc3MsCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICBhbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGUgZXh0cmFzOwogICAgICAgICBsaXN0ZW5lci0+b25TdGF0dXMocHJvZ3Jlc3MsIGV4dHJhcyk7CkBAIC01Niw3ICs1Nyw3IEBACiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBwdXNoQmFja0NvbnRlbnRzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNtZCwKLSAgICAgICAgYm9vbCBhZGRXaWxkY2FyZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRXaWxkY2FyZCkgewogICAgIERJUiogZGlyID0gb3BlbmRpcihwYXRoLmNfc3RyKCkpOwogICAgIGlmIChkaXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7CkBAIC03OSw3ICs4MCw3IEBACiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBleGVjUm0oY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGludCBzdGFydFByb2dyZXNzLCBpbnQgc3RlcFByb2dyZXNzLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIG5vdGlmeVByb2dyZXNzKHN0YXJ0UHJvZ3Jlc3MsIGxpc3RlbmVyKTsKIAogICAgIHVpbnQ2NF90IGV4cGVjdGVkQnl0ZXMgPSBHZXRUcmVlQnl0ZXMocGF0aCk7CkBAIC0xMTQsMTQgKzExNSwxNyBAQAogCiAgICAgICAgIHNsZWVwKDEpOwogICAgICAgICB1aW50NjRfdCBkZWx0YUZyZWVCeXRlcyA9IEdldEZyZWVCeXRlcyhwYXRoKSAtIHN0YXJ0RnJlZUJ5dGVzOwotICAgICAgICBub3RpZnlQcm9ncmVzcyhzdGFydFByb2dyZXNzICsgQ09OU1RSQUlOKChpbnQpCi0gICAgICAgICAgICAgICAgKChkZWx0YUZyZWVCeXRlcyAqIHN0ZXBQcm9ncmVzcykgLyBleHBlY3RlZEJ5dGVzKSwgMCwgc3RlcFByb2dyZXNzKSwgbGlzdGVuZXIpOworICAgICAgICBub3RpZnlQcm9ncmVzcygKKyAgICAgICAgICAgIHN0YXJ0UHJvZ3Jlc3MgKworICAgICAgICAgICAgICAgIENPTlNUUkFJTigoaW50KSgoZGVsdGFGcmVlQnl0ZXMgKiBzdGVwUHJvZ3Jlc3MpIC8gZXhwZWN0ZWRCeXRlcyksIDAsIHN0ZXBQcm9ncmVzcyksCisgICAgICAgICAgICBsaXN0ZW5lcik7CiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIHN0YXR1c190IGV4ZWNDcChjb25zdCBzdGQ6OnN0cmluZyYgZnJvbVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b1BhdGgsIGludCBzdGFydFByb2dyZXNzLAotICAgICAgICBpbnQgc3RlcFByb2dyZXNzLCBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcFByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIG5vdGlmeVByb2dyZXNzKHN0YXJ0UHJvZ3Jlc3MsIGxpc3RlbmVyKTsKIAogICAgIHVpbnQ2NF90IGV4cGVjdGVkQnl0ZXMgPSBHZXRUcmVlQnl0ZXMoZnJvbVBhdGgpOwpAQCAtMTI5LDcgKzEzMyw3IEBACiAKICAgICBpZiAoZXhwZWN0ZWRCeXRlcyA+IHN0YXJ0RnJlZUJ5dGVzKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkRhdGEgc2l6ZSAiIDw8IGV4cGVjdGVkQnl0ZXMgPDwgIiBpcyB0b28gbGFyZ2UgdG8gZml0IGluIGZyZWUgc3BhY2UgIgotICAgICAgICAgICAgICAgIDw8IHN0YXJ0RnJlZUJ5dGVzOworICAgICAgICAgICAgICAgICAgIDw8IHN0YXJ0RnJlZUJ5dGVzOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC0xNjUsOCArMTY5LDEwIEBACiAKICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgIHVpbnQ2NF90IGRlbHRhRnJlZUJ5dGVzID0gc3RhcnRGcmVlQnl0ZXMgLSBHZXRGcmVlQnl0ZXModG9QYXRoKTsKLSAgICAgICAgbm90aWZ5UHJvZ3Jlc3Moc3RhcnRQcm9ncmVzcyArIENPTlNUUkFJTigoaW50KQotICAgICAgICAgICAgICAgICgoZGVsdGFGcmVlQnl0ZXMgKiBzdGVwUHJvZ3Jlc3MpIC8gZXhwZWN0ZWRCeXRlcyksIDAsIHN0ZXBQcm9ncmVzcyksIGxpc3RlbmVyKTsKKyAgICAgICAgbm90aWZ5UHJvZ3Jlc3MoCisgICAgICAgICAgICBzdGFydFByb2dyZXNzICsKKyAgICAgICAgICAgICAgICBDT05TVFJBSU4oKGludCkoKGRlbHRhRnJlZUJ5dGVzICogc3RlcFByb2dyZXNzKSAvIGV4cGVjdGVkQnl0ZXMpLCAwLCBzdGVwUHJvZ3Jlc3MpLAorICAgICAgICAgICAgbGlzdGVuZXIpOwogICAgIH0KICAgICByZXR1cm4gLTE7CiB9CkBAIC0xODYsOCArMTkyLDggQEAKIH0KIAogc3RhdGljIHN0YXR1c190IG1vdmVTdG9yYWdlSW50ZXJuYWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+JiBmcm9tLAotICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIHRvLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+JiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgc3RkOjpzdHJpbmcgZnJvbVBhdGg7CiAgICAgc3RkOjpzdHJpbmcgdG9QYXRoOwogCkBAIC0yMzksMTcgKzI0NSwxOSBAQAogICAgIC8vIHVzZWZ1bCBhbnl3YXkuCiAgICAgZXhlY1JtKHRvUGF0aCwgODAsIDEsIGxpc3RlbmVyKTsKIGZhaWw6CisgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+Z2V0TG9jaygpKTsKICAgICAgICAgYnJpbmdPbmxpbmUoZnJvbSk7CiAgICAgICAgIGJyaW5nT25saW5lKHRvKTsKICAgICB9CisgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgbm90aWZ5UHJvZ3Jlc3Moa01vdmVGYWlsZWRJbnRlcm5hbEVycm9yLCBsaXN0ZW5lcik7CiAgICAgcmV0dXJuIC0xOwogfQogCiB2b2lkIE1vdmVTdG9yYWdlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPiYgZnJvbSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+JiB0bywKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBhY3F1aXJlX3dha2VfbG9jayhQQVJUSUFMX1dBS0VfTE9DSywga1dha2VMb2NrKTsKIAogICAgIGFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZSBleHRyYXM7CmRpZmYgLS1naXQgYS9Nb3ZlU3RvcmFnZS5oIGIvTW92ZVN0b3JhZ2UuaAppbmRleCBkMjcxNzA0Li40NmY3NDVmIDEwMDY0NAotLS0gYS9Nb3ZlU3RvcmFnZS5oCisrKyBiL01vdmVTdG9yYWdlLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSB2b2xkIHsKIAogdm9pZCBNb3ZlU3RvcmFnZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIGZyb20sIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPiYgdG8sCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOwogCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL05ldGxpbmtIYW5kbGVyLmNwcCBiL05ldGxpbmtIYW5kbGVyLmNwcAppbmRleCA5MjEzMWU5Li5kMTgwYTk1IDEwMDY0NAotLS0gYS9OZXRsaW5rSGFuZGxlci5jcHAKKysrIGIvTmV0bGlua0hhbmRsZXIuY3BwCkBAIC0xNCw5ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgpAQCAtMjUsMTIgKzI1LDkgQEAKICNpbmNsdWRlICJOZXRsaW5rSGFuZGxlci5oIgogI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKIAotTmV0bGlua0hhbmRsZXI6Ok5ldGxpbmtIYW5kbGVyKGludCBsaXN0ZW5lclNvY2tldCkgOgotICAgICAgICAgICAgICAgIE5ldGxpbmtMaXN0ZW5lcihsaXN0ZW5lclNvY2tldCkgewotfQorTmV0bGlua0hhbmRsZXI6Ok5ldGxpbmtIYW5kbGVyKGludCBsaXN0ZW5lclNvY2tldCkgOiBOZXRsaW5rTGlzdGVuZXIobGlzdGVuZXJTb2NrZXQpIHt9CiAKLU5ldGxpbmtIYW5kbGVyOjp+TmV0bGlua0hhbmRsZXIoKSB7Ci19CitOZXRsaW5rSGFuZGxlcjo6fk5ldGxpbmtIYW5kbGVyKCkge30KIAogaW50IE5ldGxpbmtIYW5kbGVyOjpzdGFydCgpIHsKICAgICByZXR1cm4gdGhpcy0+c3RhcnRMaXN0ZW5lcigpOwpAQCAtNDAsOSArMzcsOSBAQAogICAgIHJldHVybiB0aGlzLT5zdG9wTGlzdGVuZXIoKTsKIH0KIAotdm9pZCBOZXRsaW5rSGFuZGxlcjo6b25FdmVudChOZXRsaW5rRXZlbnQgKmV2dCkgewotICAgIFZvbHVtZU1hbmFnZXIgKnZtID0gVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKTsKLSAgICBjb25zdCBjaGFyICpzdWJzeXMgPSBldnQtPmdldFN1YnN5c3RlbSgpOwordm9pZCBOZXRsaW5rSGFuZGxlcjo6b25FdmVudChOZXRsaW5rRXZlbnQqIGV2dCkgeworICAgIFZvbHVtZU1hbmFnZXIqIHZtID0gVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKTsKKyAgICBjb25zdCBjaGFyKiBzdWJzeXMgPSBldnQtPmdldFN1YnN5c3RlbSgpOwogCiAgICAgaWYgKCFzdWJzeXMpIHsKICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJObyBzdWJzeXN0ZW0gZm91bmQgaW4gbmV0bGluayBldmVudCI7CmRpZmYgLS1naXQgYS9OZXRsaW5rSGFuZGxlci5oIGIvTmV0bGlua0hhbmRsZXIuaAppbmRleCA1NmViMjNjLi44YWY3NTc1IDEwMDY0NAotLS0gYS9OZXRsaW5rSGFuZGxlci5oCisrKyBiL05ldGxpbmtIYW5kbGVyLmgKQEAgLTE5LDE2ICsxOSwxNSBAQAogCiAjaW5jbHVkZSA8c3lzdXRpbHMvTmV0bGlua0xpc3RlbmVyLmg+CiAKLWNsYXNzIE5ldGxpbmtIYW5kbGVyOiBwdWJsaWMgTmV0bGlua0xpc3RlbmVyIHsKLQotcHVibGljOgorY2xhc3MgTmV0bGlua0hhbmRsZXIgOiBwdWJsaWMgTmV0bGlua0xpc3RlbmVyIHsKKyAgcHVibGljOgogICAgIGV4cGxpY2l0IE5ldGxpbmtIYW5kbGVyKGludCBsaXN0ZW5lclNvY2tldCk7CiAgICAgdmlydHVhbCB+TmV0bGlua0hhbmRsZXIoKTsKIAogICAgIGludCBzdGFydCh2b2lkKTsKICAgICBpbnQgc3RvcCh2b2lkKTsKIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KE5ldGxpbmtFdmVudCAqZXZ0KTsKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KE5ldGxpbmtFdmVudCogZXZ0KTsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL05ldGxpbmtNYW5hZ2VyLmNwcCBiL05ldGxpbmtNYW5hZ2VyLmNwcAppbmRleCA0MDljZGM4Li5hYWNmNGI5IDEwMDY0NAotLS0gYS9OZXRsaW5rTWFuYWdlci5jcHAKKysrIGIvTmV0bGlua01hbmFnZXIuY3BwCkBAIC0xNCwxMiArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3VuLmg+CkBAIC0yOCwxNCArMjgsMTMgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAKLSNpbmNsdWRlICJOZXRsaW5rTWFuYWdlci5oIgogI2luY2x1ZGUgIk5ldGxpbmtIYW5kbGVyLmgiCisjaW5jbHVkZSAiTmV0bGlua01hbmFnZXIuaCIKIAotTmV0bGlua01hbmFnZXIgKk5ldGxpbmtNYW5hZ2VyOjpzSW5zdGFuY2UgPSBOVUxMOworTmV0bGlua01hbmFnZXIqIE5ldGxpbmtNYW5hZ2VyOjpzSW5zdGFuY2UgPSBOVUxMOwogCi1OZXRsaW5rTWFuYWdlciAqTmV0bGlua01hbmFnZXI6Okluc3RhbmNlKCkgewotICAgIGlmICghc0luc3RhbmNlKQotICAgICAgICBzSW5zdGFuY2UgPSBuZXcgTmV0bGlua01hbmFnZXIoKTsKK05ldGxpbmtNYW5hZ2VyKiBOZXRsaW5rTWFuYWdlcjo6SW5zdGFuY2UoKSB7CisgICAgaWYgKCFzSW5zdGFuY2UpIHNJbnN0YW5jZSA9IG5ldyBOZXRsaW5rTWFuYWdlcigpOwogICAgIHJldHVybiBzSW5zdGFuY2U7CiB9CiAKQEAgLTQzLDggKzQyLDcgQEAKICAgICBtQnJvYWRjYXN0ZXIgPSBOVUxMOwogfQogCi1OZXRsaW5rTWFuYWdlcjo6fk5ldGxpbmtNYW5hZ2VyKCkgewotfQorTmV0bGlua01hbmFnZXI6On5OZXRsaW5rTWFuYWdlcigpIHt9CiAKIGludCBOZXRsaW5rTWFuYWdlcjo6c3RhcnQoKSB7CiAgICAgc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKQEAgLTU2LDggKzU0LDcgQEAKICAgICBubGFkZHIubmxfcGlkID0gZ2V0cGlkKCk7CiAgICAgbmxhZGRyLm5sX2dyb3VwcyA9IDB4ZmZmZmZmZmY7CiAKLSAgICBpZiAoKG1Tb2NrID0gc29ja2V0KFBGX05FVExJTkssIFNPQ0tfREdSQU0gfCBTT0NLX0NMT0VYRUMsCi0gICAgICAgICAgICBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UKSkgPCAwKSB7CisgICAgaWYgKChtU29jayA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX0RHUkFNIHwgU09DS19DTE9FWEVDLCBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UKSkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gY3JlYXRlIHVldmVudCBzb2NrZXQiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtNzYsNyArNzMsNyBAQAogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKLSAgICBpZiAoYmluZChtU29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbmxhZGRyLCBzaXplb2YobmxhZGRyKSkgPCAwKSB7CisgICAgaWYgKGJpbmQobVNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZubGFkZHIsIHNpemVvZihubGFkZHIpKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBiaW5kIHVldmVudCBzb2NrZXQiOwogICAgICAgICBnb3RvIG91dDsKICAgICB9CmRpZmYgLS1naXQgYS9OZXRsaW5rTWFuYWdlci5oIGIvTmV0bGlua01hbmFnZXIuaAppbmRleCA5YzdiYTExLi5lMzFmYzJlIDEwMDY0NAotLS0gYS9OZXRsaW5rTWFuYWdlci5oCisrKyBiL05ldGxpbmtNYW5hZ2VyLmgKQEAgLTE3LDMyICsxNywzMiBAQAogI2lmbmRlZiBfTkVUTElOS01BTkFHRVJfSAogI2RlZmluZSBfTkVUTElOS01BTkFHRVJfSAogCi0jaW5jbHVkZSA8c3lzdXRpbHMvU29ja2V0TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxzeXN1dGlscy9Tb2NrZXRMaXN0ZW5lci5oPgogCiBjbGFzcyBOZXRsaW5rSGFuZGxlcjsKIAogY2xhc3MgTmV0bGlua01hbmFnZXIgewotcHJpdmF0ZToKLSAgICBzdGF0aWMgTmV0bGlua01hbmFnZXIgKnNJbnN0YW5jZTsKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgTmV0bGlua01hbmFnZXIqIHNJbnN0YW5jZTsKIAotcHJpdmF0ZToKLSAgICBTb2NrZXRMaXN0ZW5lciAgICAgICAqbUJyb2FkY2FzdGVyOwotICAgIE5ldGxpbmtIYW5kbGVyICAgICAgICptSGFuZGxlcjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBtU29jazsKKyAgcHJpdmF0ZToKKyAgICBTb2NrZXRMaXN0ZW5lciogbUJyb2FkY2FzdGVyOworICAgIE5ldGxpbmtIYW5kbGVyKiBtSGFuZGxlcjsKKyAgICBpbnQgbVNvY2s7CiAKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIHZpcnR1YWwgfk5ldGxpbmtNYW5hZ2VyKCk7CiAKICAgICBpbnQgc3RhcnQoKTsKICAgICBpbnQgc3RvcCgpOwogCi0gICAgdm9pZCBzZXRCcm9hZGNhc3RlcihTb2NrZXRMaXN0ZW5lciAqc2wpIHsgbUJyb2FkY2FzdGVyID0gc2w7IH0KLSAgICBTb2NrZXRMaXN0ZW5lciAqZ2V0QnJvYWRjYXN0ZXIoKSB7IHJldHVybiBtQnJvYWRjYXN0ZXI7IH0KKyAgICB2b2lkIHNldEJyb2FkY2FzdGVyKFNvY2tldExpc3RlbmVyKiBzbCkgeyBtQnJvYWRjYXN0ZXIgPSBzbDsgfQorICAgIFNvY2tldExpc3RlbmVyKiBnZXRCcm9hZGNhc3RlcigpIHsgcmV0dXJuIG1Ccm9hZGNhc3RlcjsgfQogCi0gICAgc3RhdGljIE5ldGxpbmtNYW5hZ2VyICpJbnN0YW5jZSgpOworICAgIHN0YXRpYyBOZXRsaW5rTWFuYWdlciogSW5zdGFuY2UoKTsKIAotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICBOZXRsaW5rTWFuYWdlcigpOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvUFJFVVBMT0FELmNmZyBiL1BSRVVQTE9BRC5jZmcKaW5kZXggYzhkYmY3Ny4uZGNmOTJiZSAxMDA2NDQKLS0tIGEvUFJFVVBMT0FELmNmZworKysgYi9QUkVVUExPQUQuY2ZnCkBAIC0zLDMgKzMsNiBAQAogCiBbQnVpbHRpbiBIb29rcyBPcHRpb25zXQogY2xhbmdfZm9ybWF0ID0gLS1jb21taXQgJHtQUkVVUExPQURfQ09NTUlUfSAtLXN0eWxlIGZpbGUgLS1leHRlbnNpb25zIGMsaCxjYyxjcHAKKworW0hvb2sgU2NyaXB0c10KK2Fvc3BfaG9vayA9ICR7UkVQT19ST09UfS9mcmFtZXdvcmtzL2Jhc2UvdG9vbHMvYW9zcC9hb3NwX3NoYS5zaCAke1BSRVVQTE9BRF9DT01NSVR9ICIuIgpkaWZmIC0tZ2l0IGEvUHJvY2Vzcy5jcHAgYi9Qcm9jZXNzLmNwcAppbmRleCA5MDM4YWYyLi5hNTAyOGYyIDEwMDY0NAotLS0gYS9Qcm9jZXNzLmNwcAorKysgYi9Qcm9jZXNzLmNwcApAQCAtMTQsMjggKzE0LDI4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxmdHMuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHBvbGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHB3ZC5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KIAogI2luY2x1ZGUgIlByb2Nlc3MuaCIKIApkaWZmIC0tZ2l0IGEvU2NyeXB0UGFyYW1ldGVycy5jcHAgYi9TY3J5cHRQYXJhbWV0ZXJzLmNwcAppbmRleCBjMGUyMDMwLi5mNWE5NjRmIDEwMDY0NAotLS0gYS9TY3J5cHRQYXJhbWV0ZXJzLmNwcAorKysgYi9TY3J5cHRQYXJhbWV0ZXJzLmNwcApAQCAtMTksMjAgKzE5LDE5IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLWJvb2wgcGFyc2Vfc2NyeXB0X3BhcmFtZXRlcnMoY29uc3QgY2hhciogcGFyYW1zdHIsIGludCAqTmYsIGludCAqcmYsIGludCAqcGYpIHsKK2Jvb2wgcGFyc2Vfc2NyeXB0X3BhcmFtZXRlcnMoY29uc3QgY2hhciogcGFyYW1zdHIsIGludCogTmYsIGludCogcmYsIGludCogcGYpIHsKICAgICBpbnQgcGFyYW1zWzNdID0ge307Ci0gICAgY2hhciAqdG9rZW47Ci0gICAgY2hhciAqc2F2ZXB0cjsKKyAgICBjaGFyKiB0b2tlbjsKKyAgICBjaGFyKiBzYXZlcHRyOwogICAgIGludCBpOwogCiAgICAgLyoKICAgICAgKiBUaGUgdG9rZW4gd2UncmUgbG9va2luZyBmb3Igc2hvdWxkIGJlIHRocmVlIGludGVnZXJzIHNlcGFyYXRlZCBieQogICAgICAqIGNvbG9ucyAoZS5nLiwgIjEyOjg6MSIpLiBTY2FuIHRoZSBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgaXQgbWF0Y2hlcy4KICAgICAgKi8KLSAgICBmb3IgKGkgPSAwLCB0b2tlbiA9IHN0cnRva19yKGNvbnN0X2Nhc3Q8Y2hhciAqPihwYXJhbXN0ciksICI6IiwgJnNhdmVwdHIpOwotICAgICAgICAgICAgdG9rZW4gIT0gbnVsbHB0ciAmJiBpIDwgMzsKLSAgICAgICAgICAgIGkrKywgdG9rZW4gPSBzdHJ0b2tfcihudWxscHRyLCAiOiIsICZzYXZlcHRyKSkgewotICAgICAgICBjaGFyICplbmRwdHI7CisgICAgZm9yIChpID0gMCwgdG9rZW4gPSBzdHJ0b2tfcihjb25zdF9jYXN0PGNoYXIqPihwYXJhbXN0ciksICI6IiwgJnNhdmVwdHIpOworICAgICAgICAgdG9rZW4gIT0gbnVsbHB0ciAmJiBpIDwgMzsgaSsrLCB0b2tlbiA9IHN0cnRva19yKG51bGxwdHIsICI6IiwgJnNhdmVwdHIpKSB7CisgICAgICAgIGNoYXIqIGVuZHB0cjsKICAgICAgICAgcGFyYW1zW2ldID0gc3RydG9sKHRva2VuLCAmZW5kcHRyLCAxMCk7CiAKICAgICAgICAgLyoKQEAgLTQ1LDYgKzQ0LDggQEAKICAgICBpZiAodG9rZW4gIT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgICpOZiA9IHBhcmFtc1swXTsgKnJmID0gcGFyYW1zWzFdOyAqcGYgPSBwYXJhbXNbMl07CisgICAgKk5mID0gcGFyYW1zWzBdOworICAgICpyZiA9IHBhcmFtc1sxXTsKKyAgICAqcGYgPSBwYXJhbXNbMl07CiAgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9TY3J5cHRQYXJhbWV0ZXJzLmggYi9TY3J5cHRQYXJhbWV0ZXJzLmgKaW5kZXggMTkwODQyYi4uZWRiODBjYyAxMDA2NDQKLS0tIGEvU2NyeXB0UGFyYW1ldGVycy5oCisrKyBiL1NjcnlwdFBhcmFtZXRlcnMuaApAQCAtMjMsNiArMjMsNiBAQAogI2RlZmluZSBTQ1JZUFRfUFJPUCAicm8uY3J5cHRvLnNjcnlwdF9wYXJhbXMiCiAjZGVmaW5lIFNDUllQVF9ERUZBVUxUUyAiMTU6MzoxIgogCi1ib29sIHBhcnNlX3NjcnlwdF9wYXJhbWV0ZXJzKGNvbnN0IGNoYXIqIHBhcmFtc3RyLCBpbnQgKk5mLCBpbnQgKnJmLCBpbnQgKnBmKTsKK2Jvb2wgcGFyc2Vfc2NyeXB0X3BhcmFtZXRlcnMoY29uc3QgY2hhciogcGFyYW1zdHIsIGludCogTmYsIGludCogcmYsIGludCogcGYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1V0aWxzLmNwcCBiL1V0aWxzLmNwcAppbmRleCA5OGU4YTliLi5jZTFmNzc3IDEwMDY0NAotLS0gYS9VdGlscy5jcHAKKysrIGIvVXRpbHMuY3BwCkBAIC0xOSwzMSArMTksMzggQEAKICNpbmNsdWRlICJQcm9jZXNzLmgiCiAjaW5jbHVkZSAic2VoYW5kbGUuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGN1dGlscy9mcy5oPgogI2luY2x1ZGUgPGxvZ3dyYXAvbG9nd3JhcC5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCi0jaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CiAKICNpZm5kZWYgVU1PVU5UX05PRk9MTE9XCi0jZGVmaW5lIFVNT1VOVF9OT0ZPTExPVyAgICAweDAwMDAwMDA4ICAvKiBEb24ndCBmb2xsb3cgc3ltbGluayBvbiB1bW91bnQgKi8KKyNkZWZpbmUgVU1PVU5UX05PRk9MTE9XIDB4MDAwMDAwMDggLyogRG9uJ3QgZm9sbG93IHN5bWxpbmsgb24gdW1vdW50ICovCiAjZW5kaWYKIAordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZzsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIApAQCAtODEsOCArODgsOCBAQAogICAgIG1vZGVfdCBtb2RlID0gMDY2MCB8IFNfSUZCTEs7CiAgICAgaWYgKG1rbm9kKGNwYXRoLCBtb2RlLCBkZXYpIDwgMCkgewogICAgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugbm9kZSBmb3IgIiA8PCBtYWpvcihkZXYpCi0gICAgICAgICAgICAgICAgICAgIDw8ICI6IiA8PCBtaW5vcihkZXYpIDw8ICIgYXQgIiA8PCBwYXRoOworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIG5vZGUgZm9yICIgPDwgbWFqb3IoZGV2KSA8PCAiOiIgPDwgbWlub3IoZGV2KQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBhdCAiIDw8IHBhdGg7CiAgICAgICAgICAgICByZXMgPSAtZXJybm87CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDksOCArMjE2LDggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0YXR1c190IHJlYWRNZXRhZGF0YShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwKLSAgICAgICAgc3RkOjpzdHJpbmcqIGZzVXVpZCwgc3RkOjpzdHJpbmcqIGZzTGFiZWwsIGJvb2wgdW50cnVzdGVkKSB7CitzdGF0aWMgc3RhdHVzX3QgcmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLCBzdGQ6OnN0cmluZyogZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZnNMYWJlbCwgYm9vbCB1bnRydXN0ZWQpIHsKICAgICBmc1R5cGUtPmNsZWFyKCk7CiAgICAgZnNVdWlkLT5jbGVhcigpOwogICAgIGZzTGFiZWwtPmNsZWFyKCk7CkBAIC0yNDQsMTMgKzI1MSwxMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgUmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLAotICAgICAgICBzdGQ6OnN0cmluZyogZnNVdWlkLCBzdGQ6OnN0cmluZyogZnNMYWJlbCkgeworc3RhdHVzX3QgUmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLCBzdGQ6OnN0cmluZyogZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKSB7CiAgICAgcmV0dXJuIHJlYWRNZXRhZGF0YShwYXRoLCBmc1R5cGUsIGZzVXVpZCwgZnNMYWJlbCwgZmFsc2UpOwogfQogCi1zdGF0dXNfdCBSZWFkTWV0YWRhdGFVbnRydXN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsCi0gICAgICAgIHN0ZDo6c3RyaW5nKiBmc1V1aWQsIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKSB7CitzdGF0dXNfdCBSZWFkTWV0YWRhdGFVbnRydXN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsIHN0ZDo6c3RyaW5nKiBmc1V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZzTGFiZWwpIHsKICAgICByZXR1cm4gcmVhZE1ldGFkYXRhKHBhdGgsIGZzVHlwZSwgZnNVdWlkLCBmc0xhYmVsLCB0cnVlKTsKIH0KIApAQCAtMjYxLDEzICsyNjgsMTMgQEAKIHN0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLCBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGtTZWN1cml0eUxvY2spOwogICAgIHNpemVfdCBhcmdjID0gYXJncy5zaXplKCk7Ci0gICAgY2hhcioqIGFyZ3YgPSAoY2hhcioqKSBjYWxsb2MoYXJnYywgc2l6ZW9mKGNoYXIqKSk7CisgICAgY2hhcioqIGFyZ3YgPSAoY2hhcioqKWNhbGxvYyhhcmdjLCBzaXplb2YoY2hhciopKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBhcmd2W2ldID0gKGNoYXIqKSBhcmdzW2ldLmNfc3RyKCk7CisgICAgICAgIGFyZ3ZbaV0gPSAoY2hhciopYXJnc1tpXS5jX3N0cigpOwogICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgYXJnc1tpXTsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgYXJnc1tpXTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiICAgICIgPDwgYXJnc1tpXTsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIiAgICAiIDw8IGFyZ3NbaV07CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI4OSwyMSArMjk2LDIwIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgb3V0cHV0KSB7CitzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQpIHsKICAgICByZXR1cm4gRm9ya0V4ZWN2cChhcmdzLCBvdXRwdXQsIG51bGxwdHIpOwogfQogCi1zdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQsIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KSB7CitzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soa1NlY3VyaXR5TG9jayk7CiAgICAgc3RkOjpzdHJpbmcgY21kOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewogICAgICAgICBjbWQgKz0gYXJnc1tpXSArICIgIjsKICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8IGFyZ3NbaV07CisgICAgICAgICAgICBMT0coREVCVUcpIDw8IGFyZ3NbaV07CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIiAgICAiIDw8IGFyZ3NbaV07CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICIgICAgIiA8PCBhcmdzW2ldOwogICAgICAgICB9CiAgICAgfQogICAgIG91dHB1dC5jbGVhcigpOwpAQCAtMzE0LDcgKzMyMCw3IEBACiAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICB9CiAgICAgfQotICAgIEZJTEUqIGZwID0gcG9wZW4oY21kLmNfc3RyKCksICJyIik7IC8vIE5PTElOVAorICAgIEZJTEUqIGZwID0gcG9wZW4oY21kLmNfc3RyKCksICJyIik7ICAvLyBOT0xJTlQKICAgICBpZiAoY29udGV4dCkgewogICAgICAgICBpZiAoc2V0ZXhlY2NvbihudWxscHRyKSkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldGV4ZWNjb24iOwpAQCAtMzI4LDcgKzMzNCw3IEBACiAgICAgfQogICAgIGNoYXIgbGluZVsxMDI0XTsKICAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgIT0gbnVsbHB0cikgewotICAgICAgICBMT0coVkVSQk9TRSkgPDwgbGluZTsKKyAgICAgICAgTE9HKERFQlVHKSA8PCBsaW5lOwogICAgICAgICBvdXRwdXQucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKGxpbmUpKTsKICAgICB9CiAgICAgaWYgKHBjbG9zZShmcCkgIT0gMCkgewpAQCAtMzQxLDEzICszNDcsMTMgQEAKIAogcGlkX3QgRm9ya0V4ZWN2cEFzeW5jKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewogICAgIHNpemVfdCBhcmdjID0gYXJncy5zaXplKCk7Ci0gICAgY2hhcioqIGFyZ3YgPSAoY2hhcioqKSBjYWxsb2MoYXJnYyArIDEsIHNpemVvZihjaGFyKikpOworICAgIGNoYXIqKiBhcmd2ID0gKGNoYXIqKiljYWxsb2MoYXJnYyArIDEsIHNpemVvZihjaGFyKikpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgICAgIGFyZ3ZbaV0gPSAoY2hhciopIGFyZ3NbaV0uY19zdHIoKTsKKyAgICAgICAgYXJndltpXSA9IChjaGFyKilhcmdzW2ldLmNfc3RyKCk7CiAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCBhcmdzW2ldOworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCBhcmdzW2ldOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICIgICAgIiA8PCBhcmdzW2ldOworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiICAgICIgPDwgYXJnc1tpXTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDAwLDEwICs0MDYsMTAgQEAKIHN0YXR1c190IEdlbmVyYXRlUmFuZG9tVXVpZChzdGQ6OnN0cmluZyYgb3V0KSB7CiAgICAgc3RhdHVzX3QgcmVzID0gUmVhZFJhbmRvbUJ5dGVzKDE2LCBvdXQpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgb3V0WzZdICY9IDB4MGY7ICAvKiBjbGVhciB2ZXJzaW9uICAgICAgICAqLwotICAgICAgICBvdXRbNl0gfD0gMHg0MDsgIC8qIHNldCB0byB2ZXJzaW9uIDQgICAgICovCi0gICAgICAgIG91dFs4XSAmPSAweDNmOyAgLyogY2xlYXIgdmFyaWFudCAgICAgICAgKi8KLSAgICAgICAgb3V0WzhdIHw9IDB4ODA7ICAvKiBzZXQgdG8gSUVURiB2YXJpYW50ICAqLworICAgICAgICBvdXRbNl0gJj0gMHgwZjsgLyogY2xlYXIgdmVyc2lvbiAgICAgICAgKi8KKyAgICAgICAgb3V0WzZdIHw9IDB4NDA7IC8qIHNldCB0byB2ZXJzaW9uIDQgICAgICovCisgICAgICAgIG91dFs4XSAmPSAweDNmOyAvKiBjbGVhciB2YXJpYW50ICAgICAgICAqLworICAgICAgICBvdXRbOF0gfD0gMHg4MDsgLyogc2V0IHRvIElFVEYgdmFyaWFudCAgKi8KICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTQxNSwyNCArNDIxLDI2IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZXguc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaW50IHZhbCA9IDA7CiAgICAgICAgIHN3aXRjaCAoaGV4W2ldKSB7Ci0gICAgICAgIGNhc2UgJyAnOiBjYXNlICctJzogY2FzZSAnOic6IGNvbnRpbnVlOwotICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6IHZhbCA9IDE1OyBicmVhazsKLSAgICAgICAgY2FzZSAnZSc6IGNhc2UgJ0UnOiB2YWwgPSAxNDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2QnOiBjYXNlICdEJzogdmFsID0gMTM7IGJyZWFrOwotICAgICAgICBjYXNlICdjJzogY2FzZSAnQyc6IHZhbCA9IDEyOyBicmVhazsKLSAgICAgICAgY2FzZSAnYic6IGNhc2UgJ0InOiB2YWwgPSAxMTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOiBjYXNlICdBJzogdmFsID0gMTA7IGJyZWFrOwotICAgICAgICBjYXNlICc5JzogdmFsID0gOTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzgnOiB2YWwgPSA4OyBicmVhazsKLSAgICAgICAgY2FzZSAnNyc6IHZhbCA9IDc7IGJyZWFrOwotICAgICAgICBjYXNlICc2JzogdmFsID0gNjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzUnOiB2YWwgPSA1OyBicmVhazsKLSAgICAgICAgY2FzZSAnNCc6IHZhbCA9IDQ7IGJyZWFrOwotICAgICAgICBjYXNlICczJzogdmFsID0gMzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzInOiB2YWwgPSAyOyBicmVhazsKLSAgICAgICAgY2FzZSAnMSc6IHZhbCA9IDE7IGJyZWFrOwotICAgICAgICBjYXNlICcwJzogdmFsID0gMDsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICAgICAgY2FzZSAnICc6IGNhc2UgJy0nOiBjYXNlICc6JzogY29udGludWU7CisgICAgICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6IHZhbCA9IDE1OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogdmFsID0gMTQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOiB2YWwgPSAxMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdjJzogY2FzZSAnQyc6IHZhbCA9IDEyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2InOiBjYXNlICdCJzogdmFsID0gMTE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnYSc6IGNhc2UgJ0EnOiB2YWwgPSAxMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc5JzogdmFsID0gOTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc4JzogdmFsID0gODsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc3JzogdmFsID0gNzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc2JzogdmFsID0gNjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc1JzogdmFsID0gNTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc0JzogdmFsID0gNDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICczJzogdmFsID0gMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcyJzogdmFsID0gMjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcxJzogdmFsID0gMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcwJzogdmFsID0gMDsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgfQogCiAgICAgICAgIGlmIChldmVuKSB7CkBAIC00NzUsMTAgKzQ4Myw0NiBAQAogICAgIHJldHVybiBTdHJUb0hleCh0bXAsIG91dCk7CiB9CiAKK3N0YXR1c190IEdldEJsb2NrRGV2U2l6ZShpbnQgZmQsIHVpbnQ2NF90KiBzaXplKSB7CisgICAgaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFNjQsIHNpemUpKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHZXRCbG9ja0RldlNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHVpbnQ2NF90KiBzaXplKSB7CisgICAgaW50IGZkID0gb3BlbihwYXRoLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisKKyAgICByZXMgPSBHZXRCbG9ja0RldlNpemUoZmQsIHNpemUpOworCisgICAgY2xvc2UoZmQpOworCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgR2V0QmxvY2tEZXY1MTJTZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50NjRfdCogbnJfc2VjKSB7CisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICBzdGF0dXNfdCByZXMgPSBHZXRCbG9ja0RldlNpemUocGF0aCwgJnNpemUpOworCisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgICpucl9zZWMgPSBzaXplIC8gNTEyOworCisgICAgcmV0dXJuIE9LOworfQorCiB1aW50NjRfdCBHZXRGcmVlQnl0ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKICAgICBzdHJ1Y3Qgc3RhdHZmcyBzYjsKICAgICBpZiAoc3RhdHZmcyhwYXRoLmNfc3RyKCksICZzYikgPT0gMCkgewotICAgICAgICByZXR1cm4gKHVpbnQ2NF90KSBzYi5mX2JhdmFpbCAqIHNiLmZfZnJzaXplOworICAgICAgICByZXR1cm4gKHVpbnQ2NF90KXNiLmZfYmF2YWlsICogc2IuZl9mcnNpemU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTQ4Niw3ICs1MzAsNyBAQAogCiAvLyBUT0RPOiBib3Jyb3dlZCBmcm9tIGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZGlza3VzYWdlLyB3aGljaCBzaG91bGQKIC8vIGV2ZW50dWFsbHkgYmUgbWlncmF0ZWQgaW50byBzeXN0ZW0vCi1zdGF0aWMgaW50NjRfdCBzdGF0X3NpemUoc3RydWN0IHN0YXQgKnMpIHsKK3N0YXRpYyBpbnQ2NF90IHN0YXRfc2l6ZShzdHJ1Y3Qgc3RhdCogcykgewogICAgIGludDY0X3QgYmxrc2l6ZSA9IHMtPnN0X2Jsa3NpemU7CiAgICAgLy8gY291bnQgYWN0dWFsIGJsb2NrcyB1c2VkIGluc3RlYWQgb2Ygbm9taW5hbCBmaWxlIHNpemUKICAgICBpbnQ2NF90IHNpemUgPSBzLT5zdF9ibG9ja3MgKiA1MTI7CkBAIC01MDQsOCArNTQ4LDggQEAKIGludDY0X3QgY2FsY3VsYXRlX2Rpcl9zaXplKGludCBkZmQpIHsKICAgICBpbnQ2NF90IHNpemUgPSAwOwogICAgIHN0cnVjdCBzdGF0IHM7Ci0gICAgRElSICpkOwotICAgIHN0cnVjdCBkaXJlbnQgKmRlOworICAgIERJUiogZDsKKyAgICBzdHJ1Y3QgZGlyZW50KiBkZTsKIAogICAgIGQgPSBmZG9wZW5kaXIoZGZkKTsKICAgICBpZiAoZCA9PSBOVUxMKSB7CkBAIC01MTQsNyArNTU4LDcgQEAKICAgICB9CiAKICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpIHsKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGRlLT5kX25hbWU7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZS0+ZF9uYW1lOwogICAgICAgICBpZiAoZnN0YXRhdChkZmQsIG5hbWUsICZzLCBBVF9TWU1MSU5LX05PRk9MTE9XKSA9PSAwKSB7CiAgICAgICAgICAgICBzaXplICs9IHN0YXRfc2l6ZSgmcyk7CiAgICAgICAgIH0KQEAgLTUyMywxMCArNTY3LDggQEAKIAogICAgICAgICAgICAgLyogYWx3YXlzIHNraXAgIi4iIGFuZCAiLi4iICovCiAgICAgICAgICAgICBpZiAobmFtZVswXSA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoKG5hbWVbMV0gPT0gJy4nKSAmJiAobmFtZVsyXSA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKChuYW1lWzFdID09ICcuJykgJiYgKG5hbWVbMl0gPT0gMCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdWJmZCA9IG9wZW5hdChkZmQsIG5hbWUsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkgfCBPX0NMT0VYRUMpOwpAQCAtNTQ1LDkgKzU4Nyw3IEBACiAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgcGF0aDsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ2NF90IHJlcyA9IGNhbGN1bGF0ZV9kaXJfc2l6ZShkaXJmZCk7Ci0gICAgICAgIGNsb3NlKGRpcmZkKTsKLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZV9kaXJfc2l6ZShkaXJmZCk7CiAgICAgfQogfQogCkBAIC01NjMsOCArNjAzLDcgQEAKIHN0YXR1c190IFdpcGVCbG9ja0RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewogICAgIHN0YXR1c190IHJlcyA9IC0xOwogICAgIGNvbnN0IGNoYXIqIGNfcGF0aCA9IHBhdGguY19zdHIoKTsKLSAgICB1bnNpZ25lZCBsb25nIG5yX3NlYyA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIHJhbmdlWzJdOworICAgIHVpbnQ2NF90IHJhbmdlWzJdID0gezAsIDB9OwogCiAgICAgaW50IGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oY19wYXRoLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKICAgICBpZiAoZmQgPT0gLTEpIHsKQEAgLTU3MiwxNCArNjExLDExIEBACiAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKLSAgICBpZiAoKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmbnJfc2VjKSkgPT0gLTEpIHsKKyAgICBpZiAoR2V0QmxvY2tEZXZTaXplKGZkLCAmcmFuZ2VbMV0pICE9IE9LKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZGV0ZXJtaW5lIHNpemUgb2YgIiA8PCBwYXRoOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCi0gICAgcmFuZ2VbMF0gPSAwOwotICAgIHJhbmdlWzFdID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgbnJfc2VjICogNTEyOwotCiAgICAgTE9HKElORk8pIDw8ICJBYm91dCB0byBkaXNjYXJkICIgPDwgcmFuZ2VbMV0gPDwgIiBvbiAiIDw8IHBhdGg7CiAgICAgaWYgKGlvY3RsKGZkLCBCTEtESVNDQVJELCAmcmFuZ2UpID09IDApIHsKICAgICAgICAgTE9HKElORk8pIDw8ICJEaXNjYXJkIHN1Y2Nlc3Mgb24gIiA8PCBwYXRoOwpAQCAtNTk0LDggKzYzMCw3IEBACiB9CiAKIHN0YXRpYyBib29sIGlzVmFsaWRGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIGlmIChuYW1lLmVtcHR5KCkgfHwgKG5hbWUgPT0gIi4iKSB8fCAobmFtZSA9PSAiLi4iKQotICAgICAgICAgICAgfHwgKG5hbWUuZmluZCgnLycpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgIGlmIChuYW1lLmVtcHR5KCkgfHwgKG5hbWUgPT0gIi4iKSB8fCAobmFtZSA9PSAiLi4iKSB8fCAobmFtZS5maW5kKCcvJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTY5MCw3ICs3MjUsNyBAQAogfQogCiBzdGF0dXNfdCBSZXN0b3JlY29uUmVjdXJzaXZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJTdGFydGluZyByZXN0b3JlY29uIG9mICIgPDwgcGF0aDsKKyAgICBMT0coREVCVUcpIDw8ICJTdGFydGluZyByZXN0b3JlY29uIG9mICIgPDwgcGF0aDsKIAogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga1Jlc3RvcmVjb25TdHJpbmcgPSAic2VsaW51eC5yZXN0b3JlY29uX3JlY3Vyc2l2ZSI7CiAKQEAgLTY5OSw3ICs3MzQsNyBAQAogCiAgICAgYW5kcm9pZDo6YmFzZTo6V2FpdEZvclByb3BlcnR5KGtSZXN0b3JlY29uU3RyaW5nLCBwYXRoKTsKIAotICAgIExPRyhWRVJCT1NFKSA8PCAiRmluaXNoZWQgcmVzdG9yZWNvbiBvZiAiIDw8IHBhdGg7CisgICAgTE9HKERFQlVHKSA8PCAiRmluaXNoZWQgcmVzdG9yZWNvbiBvZiAiIDw8IHBhdGg7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC03MTUsOCArNzUwLDcgQEAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBzc2l6ZV90IHNpemUgPSByZWFkbGlua2F0KGRpcmZkLCBwYXRoLmNfc3RyKCksICZidWZbMF0sIGJ1Zi5zaXplKCkpOwogICAgICAgICAvLyBVbnJlY292ZXJhYmxlIGVycm9yPwotICAgICAgICBpZiAoc2l6ZSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHNpemUgPT0gLTEpIHJldHVybiBmYWxzZTsKICAgICAgICAgLy8gSXQgZml0ISAoSWYgc2l6ZSA9PSBidWYuc2l6ZSgpLCBpdCBtYXkgaGF2ZSBiZWVuIHRydW5jYXRlZC4pCiAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemUpIDwgYnVmLnNpemUoKSkgewogICAgICAgICAgICAgcmVzdWx0LT5hc3NpZ24oJmJ1ZlswXSwgc2l6ZSk7CkBAIC03MzEsNSArNzY1LDQ3IEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8ua2VybmVsLnFlbXUiLCBmYWxzZSk7CiB9CiAKK3N0YXR1c190IFVubW91bnRUcmVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgpIHsKKyAgICBGSUxFKiBmcCA9IHNldG1udGVudCgiL3Byb2MvbW91bnRzIiwgInJlIik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIC9wcm9jL21vdW50cyI7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgLy8gU29tZSB2b2x1bWVzIGNhbiBiZSBzdGFja2VkIG9uIGVhY2ggb3RoZXIsIHNvIGZvcmNlIHVubW91bnQgaW4KKyAgICAvLyByZXZlcnNlIG9yZGVyIHRvIGdpdmUgdXMgdGhlIGJlc3QgY2hhbmNlIG9mIHN1Y2Nlc3MuCisgICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiB0b1VubW91bnQ7CisgICAgbW50ZW50KiBtZW50cnk7CisgICAgd2hpbGUgKChtZW50cnkgPSBnZXRtbnRlbnQoZnApKSAhPSBOVUxMKSB7CisgICAgICAgIGF1dG8gdGVzdCA9IHN0ZDo6c3RyaW5nKG1lbnRyeS0+bW50X2RpcikgKyAiLyI7CisgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHRlc3QsIHByZWZpeCkpIHsKKyAgICAgICAgICAgIHRvVW5tb3VudC5wdXNoX2Zyb250KHRlc3QpOworICAgICAgICB9CisgICAgfQorICAgIGVuZG1udGVudChmcCk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGggOiB0b1VubW91bnQpIHsKKyAgICAgICAgaWYgKHVtb3VudDIocGF0aC5jX3N0cigpLCBNTlRfREVUQUNIKSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB1bm1vdW50ICIgPDwgcGF0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRPRE8oMTE4NzA4NjQ5KTogZml4IGR1cGxpY2F0aW9uIHdpdGggaW5pdC91dGlsLmgKK3N0YXR1c190IFdhaXRGb3JGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCkgeworICAgIGFuZHJvaWQ6OmJhc2U6OlRpbWVyIHQ7CisgICAgd2hpbGUgKHQuZHVyYXRpb24oKSA8IHRpbWVvdXQpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgc2I7CisgICAgICAgIGlmIChzdGF0KGZpbGVuYW1lLCAmc2IpICE9IC0xKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIndhaXQgZm9yICciIDw8IGZpbGVuYW1lIDw8ICInIHRvb2sgIiA8PCB0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwbXMpOworICAgIH0KKyAgICBMT0coV0FSTklORykgPDwgIndhaXQgZm9yICciIDw8IGZpbGVuYW1lIDw8ICInIHRpbWVkIG91dCBhbmQgdG9vayAiIDw8IHQ7CisgICAgcmV0dXJuIC0xOworfQorCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL1V0aWxzLmggYi9VdGlscy5oCmluZGV4IDVjYWE0ZTkuLjRkMzUyMmEgMTAwNjQ0Ci0tLSBhL1V0aWxzLmgKKysrIGIvVXRpbHMuaApAQCAtMjAsMTIgKzIwLDEzIEBACiAjaW5jbHVkZSAiS2V5QnVmZmVyLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCi0jaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBzdHJ1Y3QgRElSOwogCkBAIC01OSwyNCArNjAsMjkgQEAKIGJvb2wgRmluZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiB2YWx1ZSk7CiAKIC8qIFJlYWRzIGZpbGVzeXN0ZW0gbWV0YWRhdGEgZnJvbSBkZXZpY2UgYXQgcGF0aCAqLwotc3RhdHVzX3QgUmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLAotICAgICAgICBzdGQ6OnN0cmluZyogZnNVdWlkLCBzdGQ6OnN0cmluZyogZnNMYWJlbCk7CitzdGF0dXNfdCBSZWFkTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsIHN0ZDo6c3RyaW5nKiBmc1V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZzTGFiZWwpOwogCiAvKiBSZWFkcyBmaWxlc3lzdGVtIG1ldGFkYXRhIGZyb20gdW50cnVzdGVkIGRldmljZSBhdCBwYXRoICovCi1zdGF0dXNfdCBSZWFkTWV0YWRhdGFVbnRydXN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsCi0gICAgICAgIHN0ZDo6c3RyaW5nKiBmc1V1aWQsIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKTsKK3N0YXR1c190IFJlYWRNZXRhZGF0YVVudHJ1c3RlZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwgc3RkOjpzdHJpbmcqIGZzVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZnNMYWJlbCk7CiAKIC8qIFJldHVybnMgZWl0aGVyIFdFWElUU1RBVFVTKCkgc3RhdHVzLCBvciBhIG5lZ2F0aXZlIGVycm5vICovCiBzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7CiBzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc2VjdXJpdHlfY29udGV4dF90IGNvbnRleHQpOwogCi1zdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQpOwotc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgb3V0cHV0LCBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCk7CitzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQpOworc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCk7CiAKIHBpZF90IEZvcmtFeGVjdnBBc3luYyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwogCisvKiBHZXRzIGJsb2NrIGRldmljZSBzaXplIGluIGJ5dGVzICovCitzdGF0dXNfdCBHZXRCbG9ja0RldlNpemUoaW50IGZkLCB1aW50NjRfdCogc2l6ZSk7CitzdGF0dXNfdCBHZXRCbG9ja0RldlNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHVpbnQ2NF90KiBzaXplKTsKKy8qIEdldHMgYmxvY2sgZGV2aWNlIHNpemUgaW4gNTEyIGJ5dGUgc2VjdG9ycyAqLworc3RhdHVzX3QgR2V0QmxvY2tEZXY1MTJTZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50NjRfdCogbnJfc2VjKTsKKwogc3RhdHVzX3QgUmVhZFJhbmRvbUJ5dGVzKHNpemVfdCBieXRlcywgc3RkOjpzdHJpbmcmIG91dCk7CiBzdGF0dXNfdCBSZWFkUmFuZG9tQnl0ZXMoc2l6ZV90IGJ5dGVzLCBjaGFyKiBidWZmZXIpOwogc3RhdHVzX3QgR2VuZXJhdGVSYW5kb21VdWlkKHN0ZDo6c3RyaW5nJiBvdXQpOwpAQCAtMTI1LDYgKzEzMSwxMCBAQAogLyogQ2hlY2tzIGlmIEFuZHJvaWQgaXMgcnVubmluZyBpbiBRRU1VICovCiBib29sIElzUnVubmluZ0luRW11bGF0b3IoKTsKIAorc3RhdHVzX3QgVW5tb3VudFRyZWUoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCk7CisKK3N0YXR1c190IFdhaXRGb3JGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCk7CisKIH0gIC8vIG5hbWVzcGFjZSB2b2xkCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9Wb2xkTmF0aXZlU2VydmljZS5jcHAgYi9Wb2xkTmF0aXZlU2VydmljZS5jcHAKaW5kZXggODE1MjNjNi4uYzU4ZmYwMSAxMDA2NDQKLS0tIGEvVm9sZE5hdGl2ZVNlcnZpY2UuY3BwCisrKyBiL1ZvbGROYXRpdmVTZXJ2aWNlLmNwcApAQCAtMjQsOSArMjQsMTAgQEAKICNpbmNsdWRlICJQcm9jZXNzLmgiCiAjaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgogCi0jaW5jbHVkZSAiY3J5cHRmcy5oIgotI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgorI2luY2x1ZGUgIkNoZWNrcG9pbnQuaCIKKyNpbmNsdWRlICJGc0NyeXB0LmgiCiAjaW5jbHVkZSAiTWV0YWRhdGFDcnlwdC5oIgorI2luY2x1ZGUgImNyeXB0ZnMuaCIKIAogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8dGhyZWFkPgpAQCAtMzQsOCArMzUsOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+CiAjaW5jbHVkZSA8ZnNfbWdyLmg+CisjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIApAQCAtODMsMTEgKzg0LDExIEBACiAgICAgdWlkX3QgdWlkOwogCiAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYocGVybWlzc2lvbiksIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZwaWQpLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJnVpZCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJnVpZCkpKSB7CiAgICAgICAgIHJldHVybiBvaygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBleGNlcHRpb24oYmluZGVyOjpTdGF0dXM6OkVYX1NFQ1VSSVRZLAotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiVUlEICVkIC8gUElEICVkIGxhY2tzIHBlcm1pc3Npb24gJXMiLCB1aWQsIHBpZCwgcGVybWlzc2lvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiVUlEICVkIC8gUElEICVkIGxhY2tzIHBlcm1pc3Npb24gJXMiLCB1aWQsIHBpZCwgcGVybWlzc2lvbikpOwogICAgIH0KIH0KIApAQCAtOTcsNyArOTgsNyBAQAogICAgICAgICByZXR1cm4gb2soKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9TRUNVUklUWSwKLSAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlVJRCAlZCBpcyBub3QgZXhwZWN0ZWQgVUlEICVkIiwgdWlkLCBleHBlY3RlZFVpZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiVUlEICVkIGlzIG5vdCBleHBlY3RlZCBVSUQgJWQiLCB1aWQsIGV4cGVjdGVkVWlkKSk7CiAgICAgfQogfQogCkBAIC0xMDgsNyArMTA5LDcgQEAKICAgICBmb3IgKGNvbnN0IGNoYXImIGMgOiBpZCkgewogICAgICAgICBpZiAoIXN0ZDo6aXNhbG51bShjKSAmJiBjICE9ICc6JyAmJiBjICE9ICcsJykgewogICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihiaW5kZXI6OlN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJJRCAlcyBpcyBtYWxmb3JtZWQiLCBpZC5jX3N0cigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiSUQgJXMgaXMgbWFsZm9ybWVkIiwgaWQuY19zdHIoKSkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBvaygpOwpAQCAtMTIwLDE2ICsxMjEsMTYgQEAKICAgICB9CiAgICAgaWYgKHBhdGhbMF0gIT0gJy8nKSB7CiAgICAgICAgIHJldHVybiBleGNlcHRpb24oYmluZGVyOjpTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJQYXRoICVzIGlzIHJlbGF0aXZlIiwgcGF0aC5jX3N0cigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJQYXRoICVzIGlzIHJlbGF0aXZlIiwgcGF0aC5jX3N0cigpKSk7CiAgICAgfQogICAgIGlmICgocGF0aCArICcvJykuZmluZCgiLy4uLyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICAgIHJldHVybiBleGNlcHRpb24oYmluZGVyOjpTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJQYXRoICVzIGlzIHNoYWR5IiwgcGF0aC5jX3N0cigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJQYXRoICVzIGlzIHNoYWR5IiwgcGF0aC5jX3N0cigpKSk7CiAgICAgfQogICAgIGZvciAoY29uc3QgY2hhciYgYyA6IHBhdGgpIHsKICAgICAgICAgaWYgKGMgPT0gJ1wwJyB8fCBjID09ICdcbicpIHsKICAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24oYmluZGVyOjpTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyBtYWxmb3JtZWQiLCBwYXRoLmNfc3RyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJQYXRoICVzIGlzIG1hbGZvcm1lZCIsIHBhdGguY19zdHIoKSkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBvaygpOwpAQCAtMTQwLDQ1ICsxNDEsNDkgQEAKICAgICBmb3IgKGNvbnN0IGNoYXImIGMgOiBoZXgpIHsKICAgICAgICAgaWYgKCFzdGQ6OmlzeGRpZ2l0KGMpICYmIGMgIT0gJzonICYmIGMgIT0gJy0nKSB7CiAgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIkhleCAlcyBpcyBtYWxmb3JtZWQiLCBoZXguY19zdHIoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIkhleCAlcyBpcyBtYWxmb3JtZWQiLCBoZXguY19zdHIoKSkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBvaygpOwogfQogCi0jZGVmaW5lIEVORk9SQ0VfVUlEKHVpZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gY2hlY2tVaWQoKHVpZCkpOyAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisjZGVmaW5lIEVORk9SQ0VfVUlEKHVpZCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gY2hlY2tVaWQoKHVpZCkpOyBcCisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCi0jZGVmaW5lIENIRUNLX0FSR1VNRU5UX0lEKGlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gY2hlY2tBcmd1bWVudElkKChpZCkpOyAgICAgICAgICBcCi0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisjZGVmaW5lIENIRUNLX0FSR1VNRU5UX0lEKGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gY2hlY2tBcmd1bWVudElkKChpZCkpOyBcCisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCi0jZGVmaW5lIENIRUNLX0FSR1VNRU5UX1BBVEgocGF0aCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gY2hlY2tBcmd1bWVudFBhdGgoKHBhdGgpKTsgICAgICBcCi0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisjZGVmaW5lIENIRUNLX0FSR1VNRU5UX1BBVEgocGF0aCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBjaGVja0FyZ3VtZW50UGF0aCgocGF0aCkpOyBcCisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCi0jZGVmaW5lIENIRUNLX0FSR1VNRU5UX0hFWChoZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gY2hlY2tBcmd1bWVudEhleCgoaGV4KSk7ICAgICAgICBcCi0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisjZGVmaW5lIENIRUNLX0FSR1VNRU5UX0hFWChoZXgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRIZXgoKGhleCkpOyBcCisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCi0jZGVmaW5lIEFDUVVJUkVfTE9DSyBcCisjZGVmaW5lIEFDUVVJUkVfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPmdldExvY2soKSk7IFwKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0jZGVmaW5lIEFDUVVJUkVfQ1JZUFRfTE9DSyBcCisjZGVmaW5lIEFDUVVJUkVfQ1JZUFRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+Z2V0Q3J5cHRMb2NrKCkpOyBcCiAgICAgQVRSQUNFX0NBTEwoKTsKIApAQCAtMTk2LDcgKzIwMSw3IEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwogfQogCi1zdGF0dXNfdCBWb2xkTmF0aXZlU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSB7CitzdGF0dXNfdCBWb2xkTmF0aXZlU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qIGFyZ3MgKi8pIHsKICAgICBhdXRvIG91dCA9IHN0ZDo6ZnN0cmVhbShTdHJpbmdQcmludGYoIi9wcm9jL3NlbGYvZmQvJWQiLCBmZCkpOwogICAgIGNvbnN0IGJpbmRlcjo6U3RhdHVzIGR1bXBfcGVybWlzc2lvbiA9IGNoZWNrUGVybWlzc2lvbihrRHVtcCk7CiAgICAgaWYgKCFkdW1wX3Blcm1pc3Npb24uaXNPaygpKSB7CkBAIC0yMTEsNyArMjE2LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OnNldExpc3RlbmVyKAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIApAQCAtMjIzLDEyICsyMjgsOCBAQAogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogCiAgICAgLy8gU2ltcGx5IGFjcXVpcmUvcmVsZWFzZSBlYWNoIGxvY2sgZm9yIHdhdGNoZG9nCi0gICAgewotICAgICAgICBBQ1FVSVJFX0xPQ0s7Ci0gICAgfQotICAgIHsKLSAgICAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwotICAgIH0KKyAgICB7IEFDUVVJUkVfTE9DSzsgfQorICAgIHsgQUNRVUlSRV9DUllQVF9MT0NLOyB9CiAKICAgICByZXR1cm4gb2soKTsKIH0KQEAgLTI4Myw3ICsyODQsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6cGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXNrSWQsIGludDMyX3QgcGFydGl0aW9uVHlwZSwKLSAgICAgICAgaW50MzJfdCByYXRpbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhdGlvKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSUQoZGlza0lkKTsKICAgICBBQ1FVSVJFX0xPQ0s7CkBAIC0yOTMsMTUgKzI5NCwxOSBAQAogICAgICAgICByZXR1cm4gZXJyb3IoIkZhaWxlZCB0byBmaW5kIGRpc2sgIiArIGRpc2tJZCk7CiAgICAgfQogICAgIHN3aXRjaCAocGFydGl0aW9uVHlwZSkgewotICAgIGNhc2UgUEFSVElUSU9OX1RZUEVfUFVCTElDOiByZXR1cm4gdHJhbnNsYXRlKGRpc2stPnBhcnRpdGlvblB1YmxpYygpKTsKLSAgICBjYXNlIFBBUlRJVElPTl9UWVBFX1BSSVZBVEU6IHJldHVybiB0cmFuc2xhdGUoZGlzay0+cGFydGl0aW9uUHJpdmF0ZSgpKTsKLSAgICBjYXNlIFBBUlRJVElPTl9UWVBFX01JWEVEOiByZXR1cm4gdHJhbnNsYXRlKGRpc2stPnBhcnRpdGlvbk1peGVkKHJhdGlvKSk7Ci0gICAgZGVmYXVsdDogcmV0dXJuIGVycm9yKCJVbmtub3duIHR5cGUgIiArIHN0ZDo6dG9fc3RyaW5nKHBhcnRpdGlvblR5cGUpKTsKKyAgICAgICAgY2FzZSBQQVJUSVRJT05fVFlQRV9QVUJMSUM6CisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlKGRpc2stPnBhcnRpdGlvblB1YmxpYygpKTsKKyAgICAgICAgY2FzZSBQQVJUSVRJT05fVFlQRV9QUklWQVRFOgorICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZShkaXNrLT5wYXJ0aXRpb25Qcml2YXRlKCkpOworICAgICAgICBjYXNlIFBBUlRJVElPTl9UWVBFX01JWEVEOgorICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZShkaXNrLT5wYXJ0aXRpb25NaXhlZChyYXRpbykpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKCJVbmtub3duIHR5cGUgIiArIHN0ZDo6dG9fc3RyaW5nKHBhcnRpdGlvblR5cGUpKTsKICAgICB9CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmb3JnZXRQYXJ0aXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRHdWlkLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1V1aWQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBDSEVDS19BUkdVTUVOVF9IRVgocGFydEd1aWQpOwogICAgIENIRUNLX0FSR1VNRU5UX0hFWChmc1V1aWQpOwpAQCAtMzExLDcgKzMxNiw3IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjptb3VudChjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQsIGludDMyX3QgbW91bnRGbGFncywKLSAgICAgICAgaW50MzJfdCBtb3VudFVzZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbW91bnRVc2VySWQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBDSEVDS19BUkdVTUVOVF9JRCh2b2xJZCk7CiAgICAgQUNRVUlSRV9MT0NLOwpAQCAtMzg3LDkgKzM5Miw3IEBACiAgICAgYXV0byBzdGF0dXMgPSBwYXRoRm9yVm9sSWQodm9sSWQsICZwYXRoKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHJldHVybiBzdGF0dXM7CiAKLSAgICBzdGQ6OnRocmVhZChbPV0oKSB7Ci0gICAgICAgIGFuZHJvaWQ6OnZvbGQ6OkJlbmNobWFyayhwYXRoLCBsaXN0ZW5lcik7Ci0gICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoWz1dKCkgeyBhbmRyb2lkOjp2b2xkOjpCZW5jaG1hcmsocGF0aCwgbGlzdGVuZXIpOyB9KS5kZXRhY2goKTsKICAgICByZXR1cm4gb2soKTsKIH0KIApAQCAtNDA0LDggKzQwNyw5IEBACiAgICAgcmV0dXJuIHRyYW5zbGF0ZShhbmRyb2lkOjp2b2xkOjpDaGVja0VuY3J5cHRpb24ocGF0aCkpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bW92ZVN0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZyb21Wb2xJZCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRvVm9sSWQsIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bW92ZVN0b3JhZ2UoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZyb21Wb2xJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRvVm9sSWQsCisgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBDSEVDS19BUkdVTUVOVF9JRChmcm9tVm9sSWQpOwogICAgIENIRUNLX0FSR1VNRU5UX0lEKHRvVm9sSWQpOwpAQCAtNDE5LDkgKzQyMyw3IEBACiAgICAgICAgIHJldHVybiBlcnJvcigiRmFpbGVkIHRvIGZpbmQgdm9sdW1lICIgKyB0b1ZvbElkKTsKICAgICB9CiAKLSAgICBzdGQ6OnRocmVhZChbPV0oKSB7Ci0gICAgICAgIGFuZHJvaWQ6OnZvbGQ6Ok1vdmVTdG9yYWdlKGZyb21Wb2wsIHRvVm9sLCBsaXN0ZW5lcik7Ci0gICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoWz1dKCkgeyBhbmRyb2lkOjp2b2xkOjpNb3ZlU3RvcmFnZShmcm9tVm9sLCB0b1ZvbCwgbGlzdGVuZXIpOyB9KS5kZXRhY2goKTsKICAgICByZXR1cm4gb2soKTsKIH0KIApAQCAtNDMxLDExICs0MzMsMjAgQEAKIAogICAgIHN0ZDo6c3RyaW5nIHRtcDsKICAgICBzd2l0Y2ggKHJlbW91bnRNb2RlKSB7Ci0gICAgY2FzZSBSRU1PVU5UX01PREVfTk9ORTogdG1wID0gIm5vbmUiOyBicmVhazsKLSAgICBjYXNlIFJFTU9VTlRfTU9ERV9ERUZBVUxUOiB0bXAgPSAiZGVmYXVsdCI7IGJyZWFrOwotICAgIGNhc2UgUkVNT1VOVF9NT0RFX1JFQUQ6IHRtcCA9ICJyZWFkIjsgYnJlYWs7Ci0gICAgY2FzZSBSRU1PVU5UX01PREVfV1JJVEU6IHRtcCA9ICJ3cml0ZSI7IGJyZWFrOwotICAgIGRlZmF1bHQ6IHJldHVybiBlcnJvcigiVW5rbm93biBtb2RlICIgKyBzdGQ6OnRvX3N0cmluZyhyZW1vdW50TW9kZSkpOworICAgICAgICBjYXNlIFJFTU9VTlRfTU9ERV9OT05FOgorICAgICAgICAgICAgdG1wID0gIm5vbmUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVNT1VOVF9NT0RFX0RFRkFVTFQ6CisgICAgICAgICAgICB0bXAgPSAiZGVmYXVsdCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRU1PVU5UX01PREVfUkVBRDoKKyAgICAgICAgICAgIHRtcCA9ICJyZWFkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFTU9VTlRfTU9ERV9XUklURToKKyAgICAgICAgICAgIHRtcCA9ICJ3cml0ZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigiVW5rbm93biBtb2RlICIgKyBzdGQ6OnRvX3N0cmluZyhyZW1vdW50TW9kZSkpOwogICAgIH0KICAgICByZXR1cm4gdHJhbnNsYXRlKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW91bnRVaWQodWlkLCB0bXApKTsKIH0KQEAgLTQ0OSwxNCArNDYwLDE1IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpjcmVhdGVPYmIoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VLZXksIGludDMyX3Qgb3duZXJHaWQsIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZUtleSwgaW50MzJfdCBvd25lckdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIENIRUNLX0FSR1VNRU5UX1BBVEgoc291cmNlUGF0aCk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSEVYKHNvdXJjZUtleSk7CiAgICAgQUNRVUlSRV9MT0NLOwogCiAgICAgcmV0dXJuIHRyYW5zbGF0ZSgKLSAgICAgICAgICAgIFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPmNyZWF0ZU9iYihzb3VyY2VQYXRoLCBzb3VyY2VLZXksIG93bmVyR2lkLCBfYWlkbF9yZXR1cm4pKTsKKyAgICAgICAgVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+Y3JlYXRlT2JiKHNvdXJjZVBhdGgsIHNvdXJjZUtleSwgb3duZXJHaWQsIF9haWRsX3JldHVybikpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZGVzdHJveU9iYihjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQpIHsKQEAgLTQ2Nyw1MiArNDc5LDg2IEBACiAgICAgcmV0dXJuIHRyYW5zbGF0ZShWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5kZXN0cm95T2JiKHZvbElkKSk7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmc3RyaW0oaW50MzJfdCBmc3RyaW1GbGFncywKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpjcmVhdGVTdHViVm9sdW1lKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNUeXBlLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1V1aWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc0xhYmVsLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQ0hFQ0tfQVJHVU1FTlRfUEFUSChzb3VyY2VQYXRoKTsKKyAgICBDSEVDS19BUkdVTUVOVF9QQVRIKG1vdW50UGF0aCk7CisgICAgQ0hFQ0tfQVJHVU1FTlRfSEVYKGZzVXVpZCk7CisgICAgLy8gTGFiZWwgbGltaXRhdGlvbiBzZWVtcyB0byBiZSBkaWZmZXJlbnQgYmV0d2VlbiBmcyAoaW5jbHVkaW5nIGFsbG93ZWQgY2hhcmFjdGVycyksIHNvIGNoZWNraW5nCisgICAgLy8gaXMgcXVpdGUgbWVhbmluZ2xlc3MuCisgICAgQUNRVUlSRV9MT0NLOworCisgICAgcmV0dXJuIHRyYW5zbGF0ZShWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5jcmVhdGVTdHViVm9sdW1lKHNvdXJjZVBhdGgsIG1vdW50UGF0aCwgZnNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc1V1aWQsIGZzTGFiZWwsIF9haWRsX3JldHVybikpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZGVzdHJveVN0dWJWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQ0hFQ0tfQVJHVU1FTlRfSUQodm9sSWQpOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiB0cmFuc2xhdGUoVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+ZGVzdHJveVN0dWJWb2x1bWUodm9sSWQpKTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZzdHJpbSgKKyAgICBpbnQzMl90IGZzdHJpbUZsYWdzLCBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIAotICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsKLSAgICAgICAgYW5kcm9pZDo6dm9sZDo6VHJpbShsaXN0ZW5lcik7Ci0gICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoWz1dKCkgeyBhbmRyb2lkOjp2b2xkOjpUcmltKGxpc3RlbmVyKTsgfSkuZGV0YWNoKCk7CiAgICAgcmV0dXJuIG9rKCk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpydW5JZGxlTWFpbnQoCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKLSAgICBzdGQ6OnRocmVhZChbPV0oKSB7Ci0gICAgICAgIGFuZHJvaWQ6OnZvbGQ6OlJ1bklkbGVNYWludChsaXN0ZW5lcik7Ci0gICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoWz1dKCkgeyBhbmRyb2lkOjp2b2xkOjpSdW5JZGxlTWFpbnQobGlzdGVuZXIpOyB9KS5kZXRhY2goKTsKICAgICByZXR1cm4gb2soKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmFib3J0SWRsZU1haW50KAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9MT0NLOwogCi0gICAgc3RkOjp0aHJlYWQoWz1dKCkgewotICAgICAgICBhbmRyb2lkOjp2b2xkOjpBYm9ydElkbGVNYWludChsaXN0ZW5lcik7Ci0gICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoWz1dKCkgeyBhbmRyb2lkOjp2b2xkOjpBYm9ydElkbGVNYWludChsaXN0ZW5lcik7IH0pLmRldGFjaCgpOwogICAgIHJldHVybiBvaygpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bW91bnRBcHBGdXNlKGludDMyX3QgdWlkLCBpbnQzMl90IHBpZCwgaW50MzJfdCBtb3VudElkLAotICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIF9haWRsX3JldHVybikgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om1vdW50QXBwRnVzZShpbnQzMl90IHVpZCwgaW50MzJfdCBtb3VudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIF9haWRsX3JldHVybikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGUoVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+bW91bnRBcHBGdXNlKHVpZCwgcGlkLCBtb3VudElkLCBfYWlkbF9yZXR1cm4pKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPm1vdW50QXBwRnVzZSh1aWQsIG1vdW50SWQsIF9haWRsX3JldHVybikpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6dW5tb3VudEFwcEZ1c2UoaW50MzJfdCB1aWQsIGludDMyX3QgcGlkLCBpbnQzMl90IG1vdW50SWQpIHsKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjp1bm1vdW50QXBwRnVzZShpbnQzMl90IHVpZCwgaW50MzJfdCBtb3VudElkKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9MT0NLOwogCi0gICAgcmV0dXJuIHRyYW5zbGF0ZShWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT51bm1vdW50QXBwRnVzZSh1aWQsIHBpZCwgbW91bnRJZCkpOworICAgIHJldHVybiB0cmFuc2xhdGUoVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+dW5tb3VudEFwcEZ1c2UodWlkLCBtb3VudElkKSk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpvcGVuQXBwRnVzZUZpbGUoaW50MzJfdCB1aWQsIGludDMyX3QgbW91bnRJZCwgaW50MzJfdCBmaWxlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogX2FpZGxfcmV0dXJuKSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQUNRVUlSRV9MT0NLOworCisgICAgaW50IGZkID0gVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+b3BlbkFwcEZ1c2VGaWxlKHVpZCwgbW91bnRJZCwgZmlsZUlkLCBmbGFncyk7CisgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgIHJldHVybiBlcnJvcigiRmFpbGVkIHRvIG9wZW4gQXBwRnVzZSBmaWxlIGZvciB1aWQ6ICIgKyBzdGQ6OnRvX3N0cmluZyh1aWQpICsKKyAgICAgICAgICAgICAgICAgICAgICIgbW91bnRJZDogIiArIHN0ZDo6dG9fc3RyaW5nKG1vdW50SWQpICsgIiBmaWxlSWQ6ICIgKyBzdGQ6OnRvX3N0cmluZyhmaWxlSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICIgZmxhZ3M6ICIgKyBzdGQ6OnRvX3N0cmluZyhmbGFncykpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQoZmQpOworICAgIHJldHVybiBvaygpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlQ2hlY2tQYXNzd29yZChjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpIHsKQEAgLTU0MSw3ICs1ODcsNyBAQAogfQogCiBzdGF0aWMgaW50IGZkZUVuYWJsZUludGVybmFsKGludDMyX3QgcGFzc3dvcmRUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsCi0gICAgICAgIGludDMyX3QgZW5jcnlwdGlvbkZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGlvbkZsYWdzKSB7CiAgICAgYm9vbCBub1VpID0gKGVuY3J5cHRpb25GbGFncyAmIFZvbGROYXRpdmVTZXJ2aWNlOjpFTkNSWVBUSU9OX0ZMQUdfTk9fVUkpICE9IDA7CiAKICAgICBmb3IgKGludCB0cmllcyA9IDA7IHRyaWVzIDwgMjsgKyt0cmllcykgewpAQCAtNTYyLDE3ICs2MDgsMTcgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmZGVFbmFibGUoaW50MzJfdCBwYXNzd29yZFR5cGUsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCwgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpIHsKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmZGVFbmFibGUoaW50MzJfdCBwYXNzd29yZFR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKICAgICBMT0coREVCVUcpIDw8ICJmZGVFbmFibGUoIiA8PCBwYXNzd29yZFR5cGUgPDwgIiwgKiwgIiA8PCBlbmNyeXB0aW9uRmxhZ3MgPDwgIikiOwotICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgImU0Y3J5cHRfaXNfbmF0aXZlLCBmZGVFbmFibGUgaW52YWxpZCI7Ci0gICAgICAgIHJldHVybiBlcnJvcigiZTRjcnlwdF9pc19uYXRpdmUsIGZkZUVuYWJsZSBpbnZhbGlkIik7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZnNjcnlwdF9pc19uYXRpdmUsIGZkZUVuYWJsZSBpbnZhbGlkIjsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJmc2NyeXB0X2lzX25hdGl2ZSwgZmRlRW5hYmxlIGludmFsaWQiKTsKICAgICB9Ci0gICAgTE9HKERFQlVHKSA8PCAiIWU0Y3J5cHRfaXNfbmF0aXZlLCBzcGF3bmluZyBmZGVFbmFibGVJbnRlcm5hbCI7CisgICAgTE9HKERFQlVHKSA8PCAiIWZzY3J5cHRfaXNfbmF0aXZlLCBzcGF3bmluZyBmZGVFbmFibGVJbnRlcm5hbCI7CiAKICAgICAvLyBTcGF3biBhcyB0aHJlYWQgc28gaW5pdCBjYW4gaXNzdWUgY29tbWFuZHMgYmFjayB0byB2b2xkIHdpdGhvdXQKICAgICAvLyBjYXVzaW5nIGRlYWRsb2NrLCB1c3VhbGx5IGFzIGEgcmVzdWx0IG9mIHByZXBfZGF0YV9mcy4KQEAgLTU4MSw3ICs2MjcsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlQ2hhbmdlUGFzc3dvcmQoaW50MzJfdCBwYXNzd29yZFR5cGUsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIApAQCAtNTk1LDggKzY0MSw3IEBACiAgICAgcmV0dXJuIHRyYW5zbGF0ZShjcnlwdGZzX3ZlcmlmeV9wYXNzd2QocGFzc3dvcmQuY19zdHIoKSkpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlR2V0RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZUdldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKQEAgLTYwOSw4ICs2NTQsNyBAQAogICAgIH0KIH0KIAotYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZVNldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZVNldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIApAQCAtNjQ4LDE0ICs2OTIsMTQgQEAKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X2luaXRpYWxpemVfZ2xvYmFsX2RlKCkpOworICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGZzY3J5cHRfaW5pdGlhbGl6ZV9nbG9iYWxfZGUoKSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjptb3VudERlZmF1bHRFbmNyeXB0ZWQoKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwogCi0gICAgaWYgKCFlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgaWYgKCFmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIC8vIFNwYXduIGFzIHRocmVhZCBzbyBpbml0IGNhbiBpc3N1ZSBjb21tYW5kcyBiYWNrIHRvIHZvbGQgd2l0aG91dAogICAgICAgICAvLyBjYXVzaW5nIGRlYWRsb2NrLCB1c3VhbGx5IGFzIGEgcmVzdWx0IG9mIHByZXBfZGF0YV9mcy4KICAgICAgICAgc3RkOjp0aHJlYWQoJmNyeXB0ZnNfbW91bnRfZGVmYXVsdF9lbmNyeXB0ZWQpLmRldGFjaCgpOwpAQCAtNjY3LDcgKzcxMSw3IEBACiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwogCi0gICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZTRjcnlwdF9pbml0X3VzZXIwKCkpOworICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGZzY3J5cHRfaW5pdF91c2VyMCgpKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmlzQ29udmVydGlibGVUb0ZiZShib29sKiBfYWlkbF9yZXR1cm4pIHsKQEAgLTY4Miw4MSArNzI2LDE0MiBAQAogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGU0Y3J5cHRfbW91bnRfbWV0YWRhdGFfZW5jcnlwdGVkKG1vdW50UG9pbnQsIGZhbHNlKSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZnNjcnlwdF9tb3VudF9tZXRhZGF0YV9lbmNyeXB0ZWQobW91bnRQb2ludCwgZmFsc2UpKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmVuY3J5cHRGc3RhYihjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQb2ludCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGU0Y3J5cHRfbW91bnRfbWV0YWRhdGFfZW5jcnlwdGVkKG1vdW50UG9pbnQsIHRydWUpKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChmc2NyeXB0X21vdW50X21ldGFkYXRhX2VuY3J5cHRlZChtb3VudFBvaW50LCB0cnVlKSk7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpjcmVhdGVVc2VyS2V5KGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsCi0gICAgICAgIGJvb2wgZXBoZW1lcmFsKSB7CitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6Y3JlYXRlVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLCBib29sIGVwaGVtZXJhbCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGU0Y3J5cHRfdm9sZF9jcmVhdGVfdXNlcl9rZXkodXNlcklkLCB1c2VyU2VyaWFsLCBlcGhlbWVyYWwpKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChmc2NyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5KHVzZXJJZCwgdXNlclNlcmlhbCwgZXBoZW1lcmFsKSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpkZXN0cm95VXNlcktleShpbnQzMl90IHVzZXJJZCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGU0Y3J5cHRfZGVzdHJveV91c2VyX2tleSh1c2VySWQpKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChmc2NyeXB0X2Rlc3Ryb3lfdXNlcl9rZXkodXNlcklkKSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjphZGRVc2VyS2V5QXV0aChpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGU0Y3J5cHRfYWRkX3VzZXJfa2V5X2F1dGgodXNlcklkLCB1c2VyU2VyaWFsLCB0b2tlbiwgc2VjcmV0KSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZnNjcnlwdF9hZGRfdXNlcl9rZXlfYXV0aCh1c2VySWQsIHVzZXJTZXJpYWwsIHRva2VuLCBzZWNyZXQpKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZpeGF0ZU5ld2VzdFVzZXJLZXlBdXRoKGludDMyX3QgdXNlcklkKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwogCi0gICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZTRjcnlwdF9maXhhdGVfbmV3ZXN0X3VzZXJfa2V5X2F1dGgodXNlcklkKSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZnNjcnlwdF9maXhhdGVfbmV3ZXN0X3VzZXJfa2V5X2F1dGgodXNlcklkKSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjp1bmxvY2tVc2VyS2V5KGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGU0Y3J5cHRfdW5sb2NrX3VzZXJfa2V5KHVzZXJJZCwgdXNlclNlcmlhbCwgdG9rZW4sIHNlY3JldCkpOworICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGZzY3J5cHRfdW5sb2NrX3VzZXJfa2V5KHVzZXJJZCwgdXNlclNlcmlhbCwgdG9rZW4sIHNlY3JldCkpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bG9ja1VzZXJLZXkoaW50MzJfdCB1c2VySWQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X2xvY2tfdXNlcl9rZXkodXNlcklkKSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZnNjcnlwdF9sb2NrX3VzZXJfa2V5KHVzZXJJZCkpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6cHJlcGFyZVVzZXJTdG9yYWdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4mIHV1aWQsCi0gICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsIGludDMyX3QgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFncykgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIHN0ZDo6c3RyaW5nIGVtcHR5X3N0cmluZyA9ICIiOwogICAgIGF1dG8gdXVpZF8gPSB1dWlkID8gKnV1aWQgOiBlbXB0eV9zdHJpbmc7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSEVYKHV1aWRfKTsKIAogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X3ByZXBhcmVfdXNlcl9zdG9yYWdlKHV1aWRfLCB1c2VySWQsIHVzZXJTZXJpYWwsIGZsYWdzKSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZnNjcnlwdF9wcmVwYXJlX3VzZXJfc3RvcmFnZSh1dWlkXywgdXNlcklkLCB1c2VyU2VyaWFsLCBmbGFncykpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZGVzdHJveVVzZXJTdG9yYWdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4mIHV1aWQsCi0gICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IGZsYWdzKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgc3RkOjpzdHJpbmcgZW1wdHlfc3RyaW5nID0gIiI7CiAgICAgYXV0byB1dWlkXyA9IHV1aWQgPyAqdXVpZCA6IGVtcHR5X3N0cmluZzsKICAgICBDSEVDS19BUkdVTUVOVF9IRVgodXVpZF8pOwogCiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwotICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGU0Y3J5cHRfZGVzdHJveV91c2VyX3N0b3JhZ2UodXVpZF8sIHVzZXJJZCwgZmxhZ3MpKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChmc2NyeXB0X2Rlc3Ryb3lfdXNlcl9zdG9yYWdlKHV1aWRfLCB1c2VySWQsIGZsYWdzKSk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpzdGFydENoZWNrcG9pbnQoaW50MzJfdCByZXRyeSkgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiBjcF9zdGFydENoZWNrcG9pbnQocmV0cnkpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bmVlZHNSb2xsYmFjayhib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKKyAgICBBQ1FVSVJFX0xPQ0s7CisKKyAgICAqX2FpZGxfcmV0dXJuID0gY3BfbmVlZHNSb2xsYmFjaygpOworICAgIHJldHVybiBvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bmVlZHNDaGVja3BvaW50KGJvb2wqIF9haWRsX3JldHVybikgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgICpfYWlkbF9yZXR1cm4gPSBjcF9uZWVkc0NoZWNrcG9pbnQoKTsKKyAgICByZXR1cm4gb2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmNvbW1pdENoYW5nZXMoKSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQUNRVUlSRV9MT0NLOworCisgICAgcmV0dXJuIGNwX2NvbW1pdENoYW5nZXMoKTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OnByZXBhcmVDaGVja3BvaW50KCkgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiBjcF9wcmVwYXJlQ2hlY2twb2ludCgpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6cmVzdG9yZUNoZWNrcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50UG9pbnQpIHsKKyAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKKyAgICBDSEVDS19BUkdVTUVOVF9QQVRIKG1vdW50UG9pbnQpOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiBjcF9yZXN0b3JlQ2hlY2twb2ludChtb3VudFBvaW50KTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om1hcmtCb290QXR0ZW1wdCgpIHsKKyAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKKyAgICBBQ1FVSVJFX0xPQ0s7CisKKyAgICByZXR1cm4gY3BfbWFya0Jvb3RBdHRlbXB0KCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjphYm9ydENoYW5nZXMoKSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQUNRVUlSRV9MT0NLOworCisgICAgcmV0dXJuIGNwX2Fib3J0Q2hhbmdlcygpOwogfQogCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZApkaWZmIC0tZ2l0IGEvVm9sZE5hdGl2ZVNlcnZpY2UuaCBiL1ZvbGROYXRpdmVTZXJ2aWNlLmgKaW5kZXggMmU5MDEwMS4uMTYxYWNiOCAxMDA2NDQKLS0tIGEvVm9sZE5hdGl2ZVNlcnZpY2UuaAorKysgYi9Wb2xkTmF0aXZlU2VydmljZS5oCkBAIC0yNiwxMCArMjYsMTAgQEAKIG5hbWVzcGFjZSB2b2xkIHsKIAogY2xhc3MgVm9sZE5hdGl2ZVNlcnZpY2UgOiBwdWJsaWMgQmluZGVyU2VydmljZTxWb2xkTmF0aXZlU2VydmljZT4sIHB1YmxpYyBvczo6Qm5Wb2xkIHsKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydCgpOwogICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJ2b2xkIjsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiAgICAgYmluZGVyOjpTdGF0dXMgc2V0TGlzdGVuZXIoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkTGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAKQEAgLTUxLDM4ICs1MSw0MiBAQAogICAgIGJpbmRlcjo6U3RhdHVzIHVubW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKTsKICAgICBiaW5kZXI6OlN0YXR1cyBmb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNUeXBlKTsKICAgICBiaW5kZXI6OlN0YXR1cyBiZW5jaG1hcmsoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkLAotICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tFbmNyeXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCk7CiAKICAgICBiaW5kZXI6OlN0YXR1cyBtb3ZlU3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgZnJvbVZvbElkLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9Wb2xJZCwKLSAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAKICAgICBiaW5kZXI6OlN0YXR1cyByZW1vdW50VWlkKGludDMyX3QgdWlkLCBpbnQzMl90IHJlbW91bnRNb2RlKTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIG1rZGlycyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiAKICAgICBiaW5kZXI6OlN0YXR1cyBjcmVhdGVPYmIoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VLZXksCi0gICAgICAgICAgICBpbnQzMl90IG93bmVyR2lkLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvd25lckdpZCwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybik7CiAgICAgYmluZGVyOjpTdGF0dXMgZGVzdHJveU9iYihjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQpOwogCi0gICAgYmluZGVyOjpTdGF0dXMgZnN0cmltKGludDMyX3QgZnN0cmltRmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7Ci0gICAgYmluZGVyOjpTdGF0dXMgcnVuSWRsZU1haW50KAotICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOwotICAgIGJpbmRlcjo6U3RhdHVzIGFib3J0SWRsZU1haW50KAotICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZVN0dWJWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzTGFiZWwsIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pOworICAgIGJpbmRlcjo6U3RhdHVzIGRlc3Ryb3lTdHViVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCk7CiAKLSAgICBiaW5kZXI6OlN0YXR1cyBtb3VudEFwcEZ1c2UoaW50MzJfdCB1aWQsIGludDMyX3QgcGlkLCBpbnQzMl90IG1vdW50SWQsCi0gICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIF9haWRsX3JldHVybik7Ci0gICAgYmluZGVyOjpTdGF0dXMgdW5tb3VudEFwcEZ1c2UoaW50MzJfdCB1aWQsIGludDMyX3QgcGlkLCBpbnQzMl90IG1vdW50SWQpOworICAgIGJpbmRlcjo6U3RhdHVzIGZzdHJpbShpbnQzMl90IGZzdHJpbUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgYmluZGVyOjpTdGF0dXMgcnVuSWRsZU1haW50KGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBhYm9ydElkbGVNYWludChjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisKKyAgICBiaW5kZXI6OlN0YXR1cyBtb3VudEFwcEZ1c2UoaW50MzJfdCB1aWQsIGludDMyX3QgbW91bnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBfYWlkbF9yZXR1cm4pOworICAgIGJpbmRlcjo6U3RhdHVzIHVubW91bnRBcHBGdXNlKGludDMyX3QgdWlkLCBpbnQzMl90IG1vdW50SWQpOworICAgIGJpbmRlcjo6U3RhdHVzIG9wZW5BcHBGdXNlRmlsZShpbnQzMl90IHVpZCwgaW50MzJfdCBtb3VudElkLCBpbnQzMl90IGZpbGVJZCwgaW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBfYWlkbF9yZXR1cm4pOwogCiAgICAgYmluZGVyOjpTdGF0dXMgZmRlQ2hlY2tQYXNzd29yZChjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGZkZVJlc3RhcnQoKTsKICAgICBiaW5kZXI6OlN0YXR1cyBmZGVDb21wbGV0ZShpbnQzMl90KiBfYWlkbF9yZXR1cm4pOwotICAgIGJpbmRlcjo6U3RhdHVzIGZkZUVuYWJsZShpbnQzMl90IHBhc3N3b3JkVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCwgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpOwotICAgIGJpbmRlcjo6U3RhdHVzIGZkZUNoYW5nZVBhc3N3b3JkKGludDMyX3QgcGFzc3dvcmRUeXBlLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBmZGVFbmFibGUoaW50MzJfdCBwYXNzd29yZFR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpOworICAgIGJpbmRlcjo6U3RhdHVzIGZkZUNoYW5nZVBhc3N3b3JkKGludDMyX3QgcGFzc3dvcmRUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGZkZVZlcmlmeVBhc3N3b3JkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCk7CiAgICAgYmluZGVyOjpTdGF0dXMgZmRlR2V0RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybik7CiAgICAgYmluZGVyOjpTdGF0dXMgZmRlU2V0RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKQEAgLTEwMSwxOCArMTA1LDMwIEBACiAgICAgYmluZGVyOjpTdGF0dXMgY3JlYXRlVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLCBib29sIGVwaGVtZXJhbCk7CiAgICAgYmluZGVyOjpTdGF0dXMgZGVzdHJveVVzZXJLZXkoaW50MzJfdCB1c2VySWQpOwogCi0gICAgYmluZGVyOjpTdGF0dXMgYWRkVXNlcktleUF1dGgoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCk7CisgICAgYmluZGVyOjpTdGF0dXMgYWRkVXNlcktleUF1dGgoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGZpeGF0ZU5ld2VzdFVzZXJLZXlBdXRoKGludDMyX3QgdXNlcklkKTsKIAotICAgIGJpbmRlcjo6U3RhdHVzIHVubG9ja1VzZXJLZXkoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCk7CisgICAgYmluZGVyOjpTdGF0dXMgdW5sb2NrVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjcmV0KTsKICAgICBiaW5kZXI6OlN0YXR1cyBsb2NrVXNlcktleShpbnQzMl90IHVzZXJJZCk7CiAKLSAgICBiaW5kZXI6OlN0YXR1cyBwcmVwYXJlVXNlclN0b3JhZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiYgdXVpZCwKLSAgICAgICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsIGludDMyX3QgZmxhZ3MpOwotICAgIGJpbmRlcjo6U3RhdHVzIGRlc3Ryb3lVc2VyU3RvcmFnZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+JiB1dWlkLAotICAgICAgICAgICAgaW50MzJfdCB1c2VySWQsIGludDMyX3QgZmxhZ3MpOworICAgIGJpbmRlcjo6U3RhdHVzIHByZXBhcmVVc2VyU3RvcmFnZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+JiB1dWlkLCBpbnQzMl90IHVzZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB1c2VyU2VyaWFsLCBpbnQzMl90IGZsYWdzKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBkZXN0cm95VXNlclN0b3JhZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiYgdXVpZCwgaW50MzJfdCB1c2VySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MpOworCisgICAgYmluZGVyOjpTdGF0dXMgbW91bnRFeHRlcm5hbFN0b3JhZ2VGb3JBcHAoY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2VOYW1lLCBpbnQzMl90IGFwcElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzYW5kYm94SWQsIGludDMyX3QgdXNlcklkKTsKKworICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0Q2hlY2twb2ludChpbnQzMl90IHJldHJ5KTsKKyAgICBiaW5kZXI6OlN0YXR1cyBuZWVkc0NoZWNrcG9pbnQoYm9vbCogX2FpZGxfcmV0dXJuKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBuZWVkc1JvbGxiYWNrKGJvb2wqIF9haWRsX3JldHVybik7CisgICAgYmluZGVyOjpTdGF0dXMgY29tbWl0Q2hhbmdlcygpOworICAgIGJpbmRlcjo6U3RhdHVzIHByZXBhcmVDaGVja3BvaW50KCk7CisgICAgYmluZGVyOjpTdGF0dXMgcmVzdG9yZUNoZWNrcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50UG9pbnQpOworICAgIGJpbmRlcjo6U3RhdHVzIG1hcmtCb290QXR0ZW1wdCgpOworICAgIGJpbmRlcjo6U3RhdHVzIGFib3J0Q2hhbmdlcygpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKZGlmZiAtLWdpdCBhL1ZvbGRVdGlsLmNwcCBiL1ZvbGRVdGlsLmNwcAppbmRleCBhZmU4YjUzLi40Yjk4MGJlIDEwMDY0NAotLS0gYS9Wb2xkVXRpbC5jcHAKKysrIGIvVm9sZFV0aWwuY3BwCkBAIC0xNCwxMyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAKLXN0cnVjdCBmc3RhYiAqZnN0YWJfZGVmYXVsdDsKLQotdm9pZCBnZXRfYmxrZGV2X3NpemUoaW50IGZkLCB1bnNpZ25lZCBsb25nKiBucl9zZWMpIHsKLSAgaWYgKChpb2N0bChmZCwgQkxLR0VUU0laRSwgbnJfc2VjKSkgPT0gLTEpIHsKLSAgICAqbnJfc2VjID0gMDsKLSAgfQotfQorc3RydWN0IGZzdGFiKiBmc3RhYl9kZWZhdWx0OwpkaWZmIC0tZ2l0IGEvVm9sZFV0aWwuaCBiL1ZvbGRVdGlsLmgKaW5kZXggZmQ2NjY3Mi4uNzgyZTM2ZCAxMDA2NDQKLS0tIGEvVm9sZFV0aWwuaAorKysgYi9Wb2xkVXRpbC5oCkBAIC0yMCwxMCArMjAsOCBAQAogI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKLWV4dGVybiBzdHJ1Y3QgZnN0YWIgKmZzdGFiX2RlZmF1bHQ7CitleHRlcm4gc3RydWN0IGZzdGFiKiBmc3RhYl9kZWZhdWx0OwogCiAjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigqKGEpKSkKIAotdm9pZCBnZXRfYmxrZGV2X3NpemUoaW50IGZkLCB1bnNpZ25lZCBsb25nKiBucl9zZWMpOwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1ZvbHVtZU1hbmFnZXIuY3BwIGIvVm9sdW1lTWFuYWdlci5jcHAKaW5kZXggOGMzMjU4Ny4uNDVkZDU5MSAxMDA2NDQKLS0tIGEvVm9sdW1lTWFuYWdlci5jcHAKKysrIGIvVm9sdW1lTWFuYWdlci5jcHAKQEAgLTI2LDggKzI2LDggQEAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCkBAIC00OCwxMCArNDgsMTEgQEAKIAogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCi0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+CisjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CiAKKyNpbmNsdWRlICJBcHBGdXNlVXRpbC5oIgogI2luY2x1ZGUgIkRldm1hcHBlci5oIgotI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgorI2luY2x1ZGUgIkZzQ3J5cHQuaCIKICNpbmNsdWRlICJMb29wLmgiCiAjaW5jbHVkZSAiTmV0bGlua01hbmFnZXIuaCIKICNpbmNsdWRlICJQcm9jZXNzLmgiCkBAIC02Myw3ICs2NCw5IEBACiAjaW5jbHVkZSAiZnMvVmZhdC5oIgogI2luY2x1ZGUgIm1vZGVsL0VtdWxhdGVkVm9sdW1lLmgiCiAjaW5jbHVkZSAibW9kZWwvT2JiVm9sdW1lLmgiCisjaW5jbHVkZSAibW9kZWwvU3R1YlZvbHVtZS5oIgogCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogCkBAIC03OSwyNCArODIsMjMgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga01ham9yQmxvY2tFeHBlcmltZW50YWxNaW4gPSAyNDA7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4ID0gMjU0OwogCi1Wb2x1bWVNYW5hZ2VyICpWb2x1bWVNYW5hZ2VyOjpzSW5zdGFuY2UgPSBOVUxMOworVm9sdW1lTWFuYWdlciogVm9sdW1lTWFuYWdlcjo6c0luc3RhbmNlID0gTlVMTDsKIAotVm9sdW1lTWFuYWdlciAqVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKSB7Ci0gICAgaWYgKCFzSW5zdGFuY2UpCi0gICAgICAgIHNJbnN0YW5jZSA9IG5ldyBWb2x1bWVNYW5hZ2VyKCk7CitWb2x1bWVNYW5hZ2VyKiBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpIHsKKyAgICBpZiAoIXNJbnN0YW5jZSkgc0luc3RhbmNlID0gbmV3IFZvbHVtZU1hbmFnZXIoKTsKICAgICByZXR1cm4gc0luc3RhbmNlOwogfQogCiBWb2x1bWVNYW5hZ2VyOjpWb2x1bWVNYW5hZ2VyKCkgewogICAgIG1EZWJ1ZyA9IGZhbHNlOwogICAgIG1OZXh0T2JiSWQgPSAwOworICAgIG1OZXh0U3R1YlZvbHVtZUlkID0gMDsKICAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucywgYXNzdW1lIHRoYXQgYSBzZWN1cmUga2V5Z3VhcmQgaXMKICAgICAvLyBzaG93aW5nIHVudGlsIHdlIGhlYXIgb3RoZXJ3aXNlCiAgICAgbVNlY3VyZUtleWd1YXJkU2hvd2luZyA9IHRydWU7CiB9CiAKLVZvbHVtZU1hbmFnZXI6On5Wb2x1bWVNYW5hZ2VyKCkgewotfQorVm9sdW1lTWFuYWdlcjo6flZvbHVtZU1hbmFnZXIoKSB7fQogCiBpbnQgVm9sdW1lTWFuYWdlcjo6dXBkYXRlVmlydHVhbERpc2soKSB7CiAgICAgQVRSQUNFX05BTUUoIlZvbHVtZU1hbmFnZXI6OnVwZGF0ZVZpcnR1YWxEaXNrIik7CkBAIC0xMTcsOCArMTE5LDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGF1dG8gZGlzayA9IG5ldyBhbmRyb2lkOjp2b2xkOjpEaXNrKCJ2aXJ0dWFsIiwgYnVmLnN0X3JkZXYsICJ2aXJ0dWFsIiwKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtBZG9wdGFibGUgfCBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a1NkKTsKKyAgICAgICAgICAgIGF1dG8gZGlzayA9IG5ldyBhbmRyb2lkOjp2b2xkOjpEaXNrKAorICAgICAgICAgICAgICAgICJ2aXJ0dWFsIiwgYnVmLnN0X3JkZXYsICJ2aXJ0dWFsIiwKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a0Fkb3B0YWJsZSB8IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprU2QpOwogICAgICAgICAgICAgbVZpcnR1YWxEaXNrID0gc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OkRpc2s+KGRpc2spOwogICAgICAgICAgICAgaGFuZGxlRGlza0FkZGVkKG1WaXJ0dWFsRGlzayk7CiAgICAgICAgIH0KQEAgLTE1Nyw3ICsxNjAsNyBAQAogICAgIC8vIHN0b3JhZ2U7IHRoZSBmcmFtZXdvcmsgd2lsbCBkZWNpZGUgaWYgaXQgc2hvdWxkIGJlIG1vdW50ZWQuCiAgICAgQ0hFQ0sobUludGVybmFsRW11bGF0ZWQgPT0gbnVsbHB0cik7CiAgICAgbUludGVybmFsRW11bGF0ZWQgPSBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6dm9sZDo6Vm9sdW1lQmFzZT4oCi0gICAgICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6RW11bGF0ZWRWb2x1bWUoIi9kYXRhL21lZGlhIikpOworICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6RW11bGF0ZWRWb2x1bWUoIi9kYXRhL21lZGlhIikpOwogICAgIG1JbnRlcm5hbEVtdWxhdGVkLT5jcmVhdGUoKTsKIAogICAgIC8vIENvbnNpZGVyIGNyZWF0aW5nIGEgdmlydHVhbCBkaXNrCkBAIC0xNzMsMTcgKzE3NiwxNyBAQAogICAgIHJldHVybiAwOwogfQogCi12b2lkIFZvbHVtZU1hbmFnZXI6OmhhbmRsZUJsb2NrRXZlbnQoTmV0bGlua0V2ZW50ICpldnQpIHsKK3ZvaWQgVm9sdW1lTWFuYWdlcjo6aGFuZGxlQmxvY2tFdmVudChOZXRsaW5rRXZlbnQqIGV2dCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtRGVidWcpIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICItLS0tLS0tLS0tLS0tLS0tIjsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJoYW5kbGVCbG9ja0V2ZW50IHdpdGggYWN0aW9uICIgPDwgKGludCkgZXZ0LT5nZXRBY3Rpb24oKTsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiLS0tLS0tLS0tLS0tLS0tLSI7CisgICAgICAgIExPRyhERUJVRykgPDwgImhhbmRsZUJsb2NrRXZlbnQgd2l0aCBhY3Rpb24gIiA8PCAoaW50KWV2dC0+Z2V0QWN0aW9uKCk7CiAgICAgICAgIGV2dC0+ZHVtcCgpOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIGV2ZW50UGF0aChldnQtPmZpbmRQYXJhbSgiREVWUEFUSCIpP2V2dC0+ZmluZFBhcmFtKCJERVZQQVRIIik6IiIpOwotICAgIHN0ZDo6c3RyaW5nIGRldlR5cGUoZXZ0LT5maW5kUGFyYW0oIkRFVlRZUEUiKT9ldnQtPmZpbmRQYXJhbSgiREVWVFlQRSIpOiIiKTsKKyAgICBzdGQ6OnN0cmluZyBldmVudFBhdGgoZXZ0LT5maW5kUGFyYW0oIkRFVlBBVEgiKSA/IGV2dC0+ZmluZFBhcmFtKCJERVZQQVRIIikgOiAiIik7CisgICAgc3RkOjpzdHJpbmcgZGV2VHlwZShldnQtPmZpbmRQYXJhbSgiREVWVFlQRSIpID8gZXZ0LT5maW5kUGFyYW0oIkRFVlRZUEUiKSA6ICIiKTsKIAogICAgIGlmIChkZXZUeXBlICE9ICJkaXNrIikgcmV0dXJuOwogCkBAIC0xOTIsNDMgKzE5NSw0MiBAQAogICAgIGRldl90IGRldmljZSA9IG1ha2VkZXYobWFqb3IsIG1pbm9yKTsKIAogICAgIHN3aXRjaCAoZXZ0LT5nZXRBY3Rpb24oKSkgewotICAgIGNhc2UgTmV0bGlua0V2ZW50OjpBY3Rpb246OmtBZGQ6IHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzb3VyY2UgOiBtRGlza1NvdXJjZXMpIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UtPm1hdGNoZXMoZXZlbnRQYXRoKSkgewotICAgICAgICAgICAgICAgIC8vIEZvciBub3csIGFzc3VtZSB0aGF0IE1NQyBhbmQgdmlydGlvLWJsayAodGhlIGxhdHRlciBpcwotICAgICAgICAgICAgICAgIC8vIGVtdWxhdG9yLXNwZWNpZmljOyBzZWUgRGlzay5jcHAgZm9yIGRldGFpbHMpIGRldmljZXMgYXJlIFNELAotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGF0IGV2ZXJ5dGhpbmcgZWxzZSBpcyBVU0IKLSAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSBzb3VyY2UtPmdldEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1ham9yID09IGtNYWpvckJsb2NrTW1jCi0gICAgICAgICAgICAgICAgICAgIHx8IChhbmRyb2lkOjp2b2xkOjpJc1J1bm5pbmdJbkVtdWxhdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbWFqb3IgPj0gKGludCkga01ham9yQmxvY2tFeHBlcmltZW50YWxNaW4KLSAgICAgICAgICAgICAgICAgICAgJiYgbWFqb3IgPD0gKGludCkga01ham9yQmxvY2tFeHBlcmltZW50YWxNYXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprU2Q7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtVc2I7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBjYXNlIE5ldGxpbmtFdmVudDo6QWN0aW9uOjprQWRkOiB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNvdXJjZSA6IG1EaXNrU291cmNlcykgeworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UtPm1hdGNoZXMoZXZlbnRQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCBhc3N1bWUgdGhhdCBNTUMgYW5kIHZpcnRpby1ibGsgKHRoZSBsYXR0ZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZW11bGF0b3Itc3BlY2lmaWM7IHNlZSBEaXNrLmNwcCBmb3IgZGV0YWlscykgZGV2aWNlcyBhcmUgU0QsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGF0IGV2ZXJ5dGhpbmcgZWxzZSBpcyBVU0IKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gc291cmNlLT5nZXRGbGFncygpOworICAgICAgICAgICAgICAgICAgICBpZiAobWFqb3IgPT0ga01ham9yQmxvY2tNbWMgfHwgKGFuZHJvaWQ6OnZvbGQ6OklzUnVubmluZ0luRW11bGF0b3IoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ham9yID49IChpbnQpa01ham9yQmxvY2tFeHBlcmltZW50YWxNaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWpvciA8PSAoaW50KWtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtTZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprVXNiOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBhdXRvIGRpc2sgPSBuZXcgYW5kcm9pZDo6dm9sZDo6RGlzayhldmVudFBhdGgsIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+Z2V0Tmlja25hbWUoKSwgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGhhbmRsZURpc2tBZGRlZChzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6dm9sZDo6RGlzaz4oZGlzaykpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBhdXRvIGRpc2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OnZvbGQ6OkRpc2soZXZlbnRQYXRoLCBkZXZpY2UsIHNvdXJjZS0+Z2V0Tmlja25hbWUoKSwgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNrQWRkZWQoc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OkRpc2s+KGRpc2spKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTmV0bGlua0V2ZW50OjpBY3Rpb246OmtDaGFuZ2U6IHsKLSAgICAgICAgTE9HKERFQlVHKSA8PCAiRGlzayBhdCAiIDw8IG1ham9yIDw8ICI6IiA8PCBtaW5vciA8PCAiIGNoYW5nZWQiOwotICAgICAgICBoYW5kbGVEaXNrQ2hhbmdlZChkZXZpY2UpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBOZXRsaW5rRXZlbnQ6OkFjdGlvbjo6a1JlbW92ZTogewotICAgICAgICBoYW5kbGVEaXNrUmVtb3ZlZChkZXZpY2UpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgICBMT0coV0FSTklORykgPDwgIlVuZXhwZWN0ZWQgYmxvY2sgZXZlbnQgYWN0aW9uICIgPDwgKGludCkgZXZ0LT5nZXRBY3Rpb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgICBjYXNlIE5ldGxpbmtFdmVudDo6QWN0aW9uOjprQ2hhbmdlOiB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJEaXNrIGF0ICIgPDwgbWFqb3IgPDwgIjoiIDw8IG1pbm9yIDw8ICIgY2hhbmdlZCI7CisgICAgICAgICAgICBoYW5kbGVEaXNrQ2hhbmdlZChkZXZpY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBOZXRsaW5rRXZlbnQ6OkFjdGlvbjo6a1JlbW92ZTogeworICAgICAgICAgICAgaGFuZGxlRGlza1JlbW92ZWQoZGV2aWNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5leHBlY3RlZCBibG9jayBldmVudCBhY3Rpb24gIiA8PCAoaW50KWV2dC0+Z2V0QWN0aW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMjM3LDcgKzIzOSw3IEBACiAgICAgLy8gdW50aWwgdGhlIHVzZXIgdW5sb2NrcyB0aGUgZGV2aWNlIHRvIGFjdHVhbGx5IHRvdWNoIGl0CiAgICAgaWYgKG1TZWN1cmVLZXlndWFyZFNob3dpbmcpIHsKICAgICAgICAgTE9HKElORk8pIDw8ICJGb3VuZCBkaXNrIGF0ICIgPDwgZGlzay0+Z2V0RXZlbnRQYXRoKCkKLSAgICAgICAgICAgICAgICA8PCAiIGJ1dCBkZWxheWluZyBzY2FuIGR1ZSB0byBzZWN1cmUga2V5Z3VhcmQiOworICAgICAgICAgICAgICAgICAgPDwgIiBidXQgZGVsYXlpbmcgc2NhbiBkdWUgdG8gc2VjdXJlIGtleWd1YXJkIjsKICAgICAgICAgbVBlbmRpbmdEaXNrcy5wdXNoX2JhY2soZGlzayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZGlzay0+Y3JlYXRlKCk7CkBAIC0zMDQsNiArMzA2LDExIEBACiAgICAgICAgICAgICByZXR1cm4gdm9sOwogICAgICAgICB9CiAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgdm9sIDogbVN0dWJWb2x1bWVzKSB7CisgICAgICAgIGlmICh2b2wtPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIHJldHVybiB2b2w7CisgICAgICAgIH0KKyAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiB2b2wgOiBtT2JiVm9sdW1lcykgewogICAgICAgICBpZiAodm9sLT5nZXRJZCgpID09IGlkKSB7CiAgICAgICAgICAgICByZXR1cm4gdm9sOwpAQCAtMzEyLDggKzMxOSw3IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXZvaWQgVm9sdW1lTWFuYWdlcjo6bGlzdFZvbHVtZXMoYW5kcm9pZDo6dm9sZDo6Vm9sdW1lQmFzZTo6VHlwZSB0eXBlLAotICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBsaXN0KSB7Cit2b2lkIFZvbHVtZU1hbmFnZXI6Omxpc3RWb2x1bWVzKGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U6OlR5cGUgdHlwZSwgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiYgbGlzdCkgewogICAgIGxpc3QuY2xlYXIoKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRpc2sgOiBtRGlza3MpIHsKICAgICAgICAgZGlzay0+bGlzdFZvbHVtZXModHlwZSwgbGlzdCk7CkBAIC0zMzMsOCArMzM5LDggQEAKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHVubGluayAiIDw8IGtleVBhdGg7CiAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICB9Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKLSAgICAgICAgaWYgKCFlNGNyeXB0X2Rlc3Ryb3lfdm9sdW1lX2tleXMoZnNVdWlkKSkgeworICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgICAgIGlmICghZnNjcnlwdF9kZXN0cm95X3ZvbHVtZV9rZXlzKGZzVXVpZCkpIHsKICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTQxMywzMyArNDE5LDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1bm1vdW50X3RyZWUoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCkgewotICAgIEZJTEUqIGZwID0gc2V0bW50ZW50KCIvcHJvYy9tb3VudHMiLCAiciIpOwotICAgIGlmIChmcCA9PSBOVUxMKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAvcHJvYy9tb3VudHMiOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIC8vIFNvbWUgdm9sdW1lcyBjYW4gYmUgc3RhY2tlZCBvbiBlYWNoIG90aGVyLCBzbyBmb3JjZSB1bm1vdW50IGluCi0gICAgLy8gcmV2ZXJzZSBvcmRlciB0byBnaXZlIHVzIHRoZSBiZXN0IGNoYW5jZSBvZiBzdWNjZXNzLgotICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gdG9Vbm1vdW50OwotICAgIG1udGVudCogbWVudHJ5OwotICAgIHdoaWxlICgobWVudHJ5ID0gZ2V0bW50ZW50KGZwKSkgIT0gTlVMTCkgewotICAgICAgICBhdXRvIHRlc3QgPSBzdGQ6OnN0cmluZyhtZW50cnktPm1udF9kaXIpICsgIi8iOwotICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aCh0ZXN0LCBwcmVmaXgpKSB7Ci0gICAgICAgICAgICB0b1VubW91bnQucHVzaF9mcm9udCh0ZXN0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbmRtbnRlbnQoZnApOwotCi0gICAgZm9yIChjb25zdCBhdXRvJiBwYXRoIDogdG9Vbm1vdW50KSB7Ci0gICAgICAgIGlmICh1bW91bnQyKHBhdGguY19zdHIoKSwgTU5UX0RFVEFDSCkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdW5tb3VudCAiIDw8IHBhdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIGludCBWb2x1bWVNYW5hZ2VyOjpyZW1vdW50VWlkKHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGUpIHsKICAgICBMT0coREVCVUcpIDw8ICJSZW1vdW50aW5nICIgPDwgdWlkIDw8ICIgYXMgbW9kZSAiIDw8IG1vZGU7CiAKQEAgLTQ5Nyw3ICs0NzYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gV2UgcHVycG9zZWZ1bGx5IGxlYXZlIHRoZSBuYW1lc3BhY2Ugb3BlbiBhY3Jvc3MgdGhlIGZvcmsKLSAgICAgICAgbnNGZCA9IG9wZW5hdChwaWRGZCwgIm5zL21udCIsIE9fUkRPTkxZKTsgLy8gbm90IE9fQ0xPRVhFQworICAgICAgICBuc0ZkID0gb3BlbmF0KHBpZEZkLCAibnMvbW50IiwgT19SRE9OTFkpOyAgLy8gbm90IE9fQ0xPRVhFQwogICAgICAgICBpZiAobnNGZCA8IDApIHsKICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBvcGVuIG5hbWVzcGFjZSBmb3IgIiA8PCBkZS0+ZF9uYW1lOwogICAgICAgICAgICAgZ290byBuZXh0OwpAQCAtNTA5LDcgKzQ4OCw3IEBACiAgICAgICAgICAgICAgICAgX2V4aXQoMSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVubW91bnRfdHJlZSgiL3N0b3JhZ2UvIik7CisgICAgICAgICAgICBhbmRyb2lkOjp2b2xkOjpVbm1vdW50VHJlZSgiL3N0b3JhZ2UvIik7CiAKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0b3JhZ2VTb3VyY2U7CiAgICAgICAgICAgICBpZiAobW9kZSA9PSAiZGVmYXVsdCIpIHsKQEAgLTUyMiwyNiArNTAxLDIyIEBACiAgICAgICAgICAgICAgICAgLy8gU2FuZSBkZWZhdWx0IG9mIG5vIHN0b3JhZ2UgdmlzaWJsZQogICAgICAgICAgICAgICAgIF9leGl0KDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudChzdG9yYWdlU291cmNlLmNfc3RyKCksICIvc3RvcmFnZSIsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsIE1TX0JJTkQgfCBNU19SRUMsIE5VTEwpKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbW91bnQgIiA8PCBzdG9yYWdlU291cmNlIDw8ICIgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGRlLT5kX25hbWU7CisgICAgICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKAorICAgICAgICAgICAgICAgICAgICBtb3VudChzdG9yYWdlU291cmNlLmNfc3RyKCksICIvc3RvcmFnZSIsIE5VTEwsIE1TX0JJTkQgfCBNU19SRUMsIE5VTEwpKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbW91bnQgIiA8PCBzdG9yYWdlU291cmNlIDw8ICIgZm9yICIgPDwgZGUtPmRfbmFtZTsKICAgICAgICAgICAgICAgICBfZXhpdCgxKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkobW91bnQoTlVMTCwgIi9zdG9yYWdlIiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTVNfUkVDIHwgTVNfU0xBVkUsIE5VTEwpKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IE1TX1NMQVZFIHRvIC9zdG9yYWdlIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBkZS0+ZF9uYW1lOworICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudChOVUxMLCAiL3N0b3JhZ2UiLCBOVUxMLCBNU19SRUMgfCBNU19TTEFWRSwgTlVMTCkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgTVNfU0xBVkUgdG8gL3N0b3JhZ2UgZm9yICIgPDwgZGUtPmRfbmFtZTsKICAgICAgICAgICAgICAgICBfZXhpdCgxKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTW91bnQgdXNlci1zcGVjaWZpYyBzeW1saW5rIGhlbHBlciBpbnRvIHBsYWNlCiAgICAgICAgICAgICB1c2VyaWRfdCB1c2VyX2lkID0gbXVsdGl1c2VyX2dldF91c2VyX2lkKHVpZCk7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyB1c2VyU291cmNlKFN0cmluZ1ByaW50ZigiL21udC91c2VyLyVkIiwgdXNlcl9pZCkpOwotICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudCh1c2VyU291cmNlLmNfc3RyKCksICIvc3RvcmFnZS9zZWxmIiwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgTVNfQklORCwgTlVMTCkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtb3VudCAiIDw8IHVzZXJTb3VyY2UgPDwgIiBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGUtPmRfbmFtZTsKKyAgICAgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkoCisgICAgICAgICAgICAgICAgICAgIG1vdW50KHVzZXJTb3VyY2UuY19zdHIoKSwgIi9zdG9yYWdlL3NlbGYiLCBOVUxMLCBNU19CSU5ELCBOVUxMKSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG1vdW50ICIgPDwgdXNlclNvdXJjZSA8PCAiIGZvciAiIDw8IGRlLT5kX25hbWU7CiAgICAgICAgICAgICAgICAgX2V4aXQoMSk7CiAgICAgICAgICAgICB9CiAKQEAgLTU1NSw3ICs1MzAsNyBAQAogICAgICAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQoY2hpbGQsIG51bGxwdHIsIDApKTsKICAgICAgICAgfQogCi1uZXh0OgorICAgIG5leHQ6CiAgICAgICAgIGNsb3NlKG5zRmQpOwogICAgICAgICBjbG9zZShwaWRGZCk7CiAgICAgfQpAQCAtNTgzLDcgKzU1OCw3IEBACiAvLyBDYW4gYmUgY2FsbGVkIHR3aWNlIChzZXF1ZW50aWFsbHkpIGR1cmluZyBzaHV0ZG93bi4gc2hvdWxkIGJlIHNhZmUgZm9yIHRoYXQuCiBpbnQgVm9sdW1lTWFuYWdlcjo6c2h1dGRvd24oKSB7CiAgICAgaWYgKG1JbnRlcm5hbEVtdWxhdGVkID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIDA7IC8vIGFscmVhZHkgc2h1dGRvd24KKyAgICAgICAgcmV0dXJuIDA7ICAvLyBhbHJlYWR5IHNodXRkb3duCiAgICAgfQogICAgIGFuZHJvaWQ6OnZvbGQ6OnNTbGVlcE9uVW5tb3VudCA9IGZhbHNlOwogICAgIG1JbnRlcm5hbEVtdWxhdGVkLT5kZXN0cm95KCk7CkBAIC01OTEsNiArNTY2LDcgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRpc2sgOiBtRGlza3MpIHsKICAgICAgICAgZGlzay0+ZGVzdHJveSgpOwogICAgIH0KKyAgICBtU3R1YlZvbHVtZXMuY2xlYXIoKTsKICAgICBtRGlza3MuY2xlYXIoKTsKICAgICBtUGVuZGluZ0Rpc2tzLmNsZWFyKCk7CiAgICAgYW5kcm9pZDo6dm9sZDo6c1NsZWVwT25Vbm1vdW50ID0gdHJ1ZTsKQEAgLTYwNSwxMyArNTgxLDE2IEBACiAgICAgaWYgKG1JbnRlcm5hbEVtdWxhdGVkICE9IG51bGxwdHIpIHsKICAgICAgICAgbUludGVybmFsRW11bGF0ZWQtPnVubW91bnQoKTsKICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBzdHViIDogbVN0dWJWb2x1bWVzKSB7CisgICAgICAgIHN0dWItPnVubW91bnQoKTsKKyAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiBkaXNrIDogbURpc2tzKSB7CiAgICAgICAgIGRpc2stPnVubW91bnRBbGwoKTsKICAgICB9CiAKICAgICAvLyBXb3JzdCBjYXNlIHdlIG1pZ2h0IGhhdmUgc29tZSBzdGFsZSBtb3VudHMgbHVya2luZyBhcm91bmQsIHNvCiAgICAgLy8gZm9yY2UgdW5tb3VudCB0aG9zZSBqdXN0IHRvIGJlIHNhZmUuCi0gICAgRklMRSogZnAgPSBzZXRtbnRlbnQoIi9wcm9jL21vdW50cyIsICJyIik7CisgICAgRklMRSogZnAgPSBzZXRtbnRlbnQoIi9wcm9jL21vdW50cyIsICJyZSIpOwogICAgIGlmIChmcCA9PSBOVUxMKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAvcHJvYy9tb3VudHMiOwogICAgICAgICByZXR1cm4gLWVycm5vOwpAQCAtNjIzLDkgKzYwMiwxMiBAQAogICAgIG1udGVudCogbWVudHJ5OwogICAgIHdoaWxlICgobWVudHJ5ID0gZ2V0bW50ZW50KGZwKSkgIT0gTlVMTCkgewogICAgICAgICBhdXRvIHRlc3QgPSBzdGQ6OnN0cmluZyhtZW50cnktPm1udF9kaXIpOwotICAgICAgICBpZiAoKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgodGVzdCwgIi9tbnQvIikgJiYKLSAgICAgICAgICAgICAhYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aCh0ZXN0LCAiL21udC92ZW5kb3IiKSkgfHwKLSAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgodGVzdCwgIi9zdG9yYWdlLyIpKSB7CisgICAgICAgIGlmICgoU3RhcnRzV2l0aCh0ZXN0LCAiL21udC8iKSAmJgorI2lmZGVmIF9fQU5EUk9JRF9ERUJVR0dBQkxFX18KKyAgICAgICAgICAgICAhU3RhcnRzV2l0aCh0ZXN0LCAiL21udC9zY3JhdGNoIikgJiYKKyNlbmRpZgorICAgICAgICAgICAgICFTdGFydHNXaXRoKHRlc3QsICIvbW50L3ZlbmRvciIpICYmICFTdGFydHNXaXRoKHRlc3QsICIvbW50L3Byb2R1Y3QiKSkgfHwKKyAgICAgICAgICAgIFN0YXJ0c1dpdGgodGVzdCwgIi9zdG9yYWdlLyIpKSB7CiAgICAgICAgICAgICB0b1VubW91bnQucHVzaF9mcm9udCh0ZXN0KTsKICAgICAgICAgfQogICAgIH0KQEAgLTY0MSw3ICs2MjMsNyBAQAogCiBpbnQgVm9sdW1lTWFuYWdlcjo6bWtkaXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CiAgICAgLy8gT25seSBvZmZlciB0byBjcmVhdGUgZGlyZWN0b3JpZXMgZm9yIHBhdGhzIG1hbmFnZWQgYnkgdm9sZAotICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHBhdGgsICIvc3RvcmFnZS8iKSkgeworICAgIGlmIChTdGFydHNXaXRoKHBhdGgsICIvc3RvcmFnZS8iKSkgewogICAgICAgICAvLyBmc19ta2RpcnMoKSBkb2VzIHN5bWxpbmsgY2hlY2tpbmcgYW5kIHJlbGF0aXZlIHBhdGggZW5mb3JjZW1lbnQKICAgICAgICAgcmV0dXJuIGZzX21rZGlycyhwYXRoLmNfc3RyKCksIDA3MDApOwogICAgIH0gZWxzZSB7CkBAIC02NTAsMTU3ICs2MzIsMTIgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBzaXplX3Qga0FwcEZ1c2VNYXhNb3VudFBvaW50TmFtZSA9IDMyOwotCi1zdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZ2V0TW91bnRQYXRoKHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nKiBwYXRoKSB7Ci0gICAgaWYgKG5hbWUuc2l6ZSgpID4ga0FwcEZ1c2VNYXhNb3VudFBvaW50TmFtZSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJBcHBGdXNlIG1vdW50IG5hbWUgaXMgdG9vIGxvbmcuIjsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoIWlzYWxudW0obmFtZVtpXSkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkFwcEZ1c2UgbW91bnQgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3Rlci4iOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKnBhdGggPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIi9tbnQvYXBwZnVzZS8lZF8lcyIsIHVpZCwgbmFtZS5jX3N0cigpKTsKLSAgICByZXR1cm4gYW5kcm9pZDo6T0s7Ci19Ci0KLXN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBtb3VudEluTmFtZXNwYWNlKHVpZF90IHVpZCwgaW50IGRldmljZV9mZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgICAvLyBSZW1vdmUgZXhpc3RpbmcgbW91bnQuCi0gICAgYW5kcm9pZDo6dm9sZDo6Rm9yY2VVbm1vdW50KHBhdGgpOwotCi0gICAgY29uc3QgYXV0byBvcHRzID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgImZkPSVpLCIKLSAgICAgICAgICAgICJyb290bW9kZT00MDAwMCwiCi0gICAgICAgICAgICAiZGVmYXVsdF9wZXJtaXNzaW9ucywiCi0gICAgICAgICAgICAiYWxsb3dfb3RoZXIsIgotICAgICAgICAgICAgInVzZXJfaWQ9JWQsZ3JvdXBfaWQ9JWQsIgotICAgICAgICAgICAgImNvbnRleHQ9XCJ1Om9iamVjdF9yOmFwcF9mdXNlX2ZpbGU6czBcIiwiCi0gICAgICAgICAgICAiZnNjb250ZXh0PXU6b2JqZWN0X3I6YXBwX2Z1c2VmczpzMCIsCi0gICAgICAgICAgICBkZXZpY2VfZmQsCi0gICAgICAgICAgICB1aWQsCi0gICAgICAgICAgICB1aWQpOwotCi0gICAgY29uc3QgaW50IHJlc3VsdCA9IFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudCgKLSAgICAgICAgICAgICIvZGV2L2Z1c2UiLCBwYXRoLmNfc3RyKCksICJmdXNlIiwKLSAgICAgICAgICAgIE1TX05PU1VJRCB8IE1TX05PREVWIHwgTVNfTk9FWEVDIHwgTVNfTk9BVElNRSwgb3B0cy5jX3N0cigpKSk7Ci0gICAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbW91bnQgIiA8PCBwYXRoOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IHJ1bkNvbW1hbmRJbk5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlX2ZkKSB7Ci0gICAgaWYgKERFQlVHX0FQUEZVU0UpIHsKLSAgICAgICAgTE9HKERFQlVHKSA8PCAiUnVuIGFwcCBmdXNlIGNvbW1hbmQgIiA8PCBjb21tYW5kIDw8ICIgZm9yIHRoZSBwYXRoICIgPDwgcGF0aAotICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gbmFtZXNwYWNlICIgPDwgdWlkOwotICAgIH0KLQotICAgIHVuaXF1ZV9mZCBkaXIob3BlbigiL3Byb2MiLCBPX1JET05MWSB8IE9fRElSRUNUT1JZIHwgT19DTE9FWEVDKSk7Ci0gICAgaWYgKGRpci5nZXQoKSA9PSAtMSkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gL3Byb2MiOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIC8vIE9idGFpbnMgcHJvY2VzcyBmaWxlIGRlc2NyaXB0b3IuCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgcGlkX3N0ciA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJWQiLCBwaWQpOwotICAgIGNvbnN0IHVuaXF1ZV9mZCBwaWRfZmQoCi0gICAgICAgICAgICBvcGVuYXQoZGlyLmdldCgpLCBwaWRfc3RyLmNfc3RyKCksIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkgfCBPX0NMT0VYRUMpKTsKLSAgICBpZiAocGlkX2ZkLmdldCgpID09IC0xKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAvcHJvYy8iIDw8IHBpZDsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBVSUQgb2YgcHJvY2Vzcy4KLSAgICB7Ci0gICAgICAgIHN0cnVjdCBzdGF0IHNiOwotICAgICAgICBjb25zdCBpbnQgcmVzdWx0ID0gZnN0YXQocGlkX2ZkLmdldCgpLCAmc2IpOwotICAgICAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHN0YXQgL3Byb2MvIiA8PCBwaWQ7Ci0gICAgICAgICAgICByZXR1cm4gLWVycm5vOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzYi5zdF91aWQgIT0gQUlEX1NZU1RFTSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiT25seSBzeXN0ZW0gY2FuIG1vdW50IGFwcGZ1c2UuIFVJRCBleHBlY3RlZD0iIDw8IEFJRF9TWVNURU0KLSAgICAgICAgICAgICAgICAgICAgPDwgIiwgYWN0dWFsPSIgPDwgc2Iuc3RfdWlkOwotICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE1hdGNoZXMgc28gZmFyLCBidXQgcmVmdXNlIHRvIHRvdWNoIGlmIGluIHJvb3QgbmFtZXNwYWNlCi0gICAgewotICAgICAgICBzdGQ6OnN0cmluZyByb290TmFtZTsKLSAgICAgICAgc3RkOjpzdHJpbmcgcGlkTmFtZTsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjp2b2xkOjpSZWFkbGlua2F0KGRpci5nZXQoKSwgIjEvbnMvbW50IiwgJnJvb3ROYW1lKQotICAgICAgICAgICAgICAgIHx8ICFhbmRyb2lkOjp2b2xkOjpSZWFkbGlua2F0KHBpZF9mZC5nZXQoKSwgIm5zL21udCIsICZwaWROYW1lKSkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIG5hbWVzcGFjZXMiOwotICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm9vdE5hbWUgPT0gcGlkTmFtZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRG9uJ3QgbW91bnQgYXBwZnVzZSBpbiByb290IG5hbWVzcGFjZSI7Ci0gICAgICAgICAgICByZXR1cm4gLUVQRVJNOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2UgcHVycG9zZWZ1bGx5IGxlYXZlIHRoZSBuYW1lc3BhY2Ugb3BlbiBhY3Jvc3MgdGhlIGZvcmsKLSAgICB1bmlxdWVfZmQgbnNfZmQob3BlbmF0KHBpZF9mZC5nZXQoKSwgIm5zL21udCIsIE9fUkRPTkxZKSk7IC8vIG5vdCBPX0NMT0VYRUMKLSAgICBpZiAobnNfZmQuZ2V0KCkgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiBuYW1lc3BhY2UgZm9yIC9wcm9jLyIgPDwgcGlkIDw8ICIvbnMvbW50IjsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0KLSAgICBpbnQgY2hpbGQgPSBmb3JrKCk7Ci0gICAgaWYgKGNoaWxkID09IDApIHsKLSAgICAgICAgaWYgKHNldG5zKG5zX2ZkLmdldCgpLCBDTE9ORV9ORVdOUykgIT0gMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXRucyI7Ci0gICAgICAgICAgICBfZXhpdCgtZXJybm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gIm1vdW50IikgewotICAgICAgICAgICAgX2V4aXQobW91bnRJbk5hbWVzcGFjZSh1aWQsIGRldmljZV9mZCwgcGF0aCkpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gInVubW91bnQiKSB7Ci0gICAgICAgICAgICAvLyBJZiBpdCdzIGp1c3QgYWZ0ZXIgYWxsIEZEIG9wZW5lZCBvbiBtb3VudCBwb2ludCBhcmUgY2xvc2VkLCB1bW91bnQyIGNhbiBmYWlsIHdpdGgKLSAgICAgICAgICAgIC8vIEVCVVNZLiBUbyBhdm9pZCB0aGUgY2FzZSwgc3BlY2lmeSBNTlRfREVUQUNILgotICAgICAgICAgICAgaWYgKHVtb3VudDIocGF0aC5jX3N0cigpLCBVTU9VTlRfTk9GT0xMT1cgfCBNTlRfREVUQUNIKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgIGVycm5vICE9IEVJTlZBTCAmJiBlcnJubyAhPSBFTk9FTlQpIHsKLSAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHVubW91bnQgZGlyZWN0b3J5LiI7Ci0gICAgICAgICAgICAgICAgX2V4aXQoLWVycm5vKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChybWRpcihwYXRoLmNfc3RyKCkpICE9IDApIHsKLSAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlbW92ZSB0aGUgbW91bnQgZGlyZWN0b3J5LiI7Ci0gICAgICAgICAgICAgICAgX2V4aXQoLWVycm5vKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9leGl0KGFuZHJvaWQ6Ok9LKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gYXBwZnVzZSBjb21tYW5kICIgPDwgY29tbWFuZDsKLSAgICAgICAgICAgIF9leGl0KC1FUEVSTSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY2hpbGQgPT0gLTEpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmb2xrIGNoaWxkIHByb2Nlc3MiOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1czsKLSAgICBURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChjaGlsZCwgJnN0YXR1cywgMCkpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQogaW50IFZvbHVtZU1hbmFnZXI6OmNyZWF0ZU9iYihjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZUtleSwKLSAgICAgICAgaW50MzJfdCBvd25lckdpZCwgc3RkOjpzdHJpbmcqIG91dFZvbElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3duZXJHaWQsIHN0ZDo6c3RyaW5nKiBvdXRWb2xJZCkgewogICAgIGludCBpZCA9IG1OZXh0T2JiSWQrKzsKIAogICAgIGF1dG8gdm9sID0gc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U+KAotICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OnZvbGQ6Ok9iYlZvbHVtZShpZCwgc291cmNlUGF0aCwgc291cmNlS2V5LCBvd25lckdpZCkpOworICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6T2JiVm9sdW1lKGlkLCBzb3VyY2VQYXRoLCBzb3VyY2VLZXksIG93bmVyR2lkKSk7CiAgICAgdm9sLT5jcmVhdGUoKTsKIAogICAgIG1PYmJWb2x1bWVzLnB1c2hfYmFjayh2b2wpOwpAQCAtODIxLDQ0ICs2NTgsNDAgQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLWludCBWb2x1bWVNYW5hZ2VyOjptb3VudEFwcEZ1c2UodWlkX3QgdWlkLCBwaWRfdCBwaWQsIGludCBtb3VudElkLAotICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCkgewotICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBzdGQ6OnRvX3N0cmluZyhtb3VudElkKTsKK2ludCBWb2x1bWVNYW5hZ2VyOjpjcmVhdGVTdHViVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc0xhYmVsLCBzdGQ6OnN0cmluZyogb3V0Vm9sSWQpIHsKKyAgICBpbnQgaWQgPSBtTmV4dFN0dWJWb2x1bWVJZCsrOworICAgIGF1dG8gdm9sID0gc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U+KAorICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6U3R1YlZvbHVtZShpZCwgc291cmNlUGF0aCwgbW91bnRQYXRoLCBmc1R5cGUsIGZzVXVpZCwgZnNMYWJlbCkpOworICAgIHZvbC0+Y3JlYXRlKCk7CiAKLSAgICAvLyBDaGVjayBtb3VudCBwb2ludCBuYW1lLgotICAgIHN0ZDo6c3RyaW5nIHBhdGg7Ci0gICAgaWYgKGdldE1vdW50UGF0aCh1aWQsIG5hbWUsICZwYXRoKSAhPSBhbmRyb2lkOjpPSykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIG1vdW50IHBvaW50IG5hbWUiOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGRpcmVjdG9yaWVzLgotICAgIGNvbnN0IGFuZHJvaWQ6OnN0YXR1c190IHJlc3VsdCA9IGFuZHJvaWQ6OnZvbGQ6OlByZXBhcmVEaXIocGF0aCwgMDcwMCwgMCwgMCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBhbmRyb2lkOjpPSykgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHByZXBhcmUgZGlyZWN0b3J5ICIgPDwgcGF0aDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8vIE9wZW4gZGV2aWNlIEZELgotICAgIGRldmljZV9mZC0+cmVzZXQob3BlbigiL2Rldi9mdXNlIiwgT19SRFdSKSk7IC8vIG5vdCBPX0NMT0VYRUMKLSAgICBpZiAoZGV2aWNlX2ZkLT5nZXQoKSA9PSAtMSkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gL2Rldi9mdXNlIjsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8vIE1vdW50LgotICAgIHJldHVybiBydW5Db21tYW5kSW5OYW1lc3BhY2UoIm1vdW50IiwgdWlkLCBwaWQsIHBhdGgsIGRldmljZV9mZC0+Z2V0KCkpOworICAgIG1TdHViVm9sdW1lcy5wdXNoX2JhY2sodm9sKTsKKyAgICAqb3V0Vm9sSWQgPSB2b2wtPmdldElkKCk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwogfQogCi1pbnQgVm9sdW1lTWFuYWdlcjo6dW5tb3VudEFwcEZ1c2UodWlkX3QgdWlkLCBwaWRfdCBwaWQsIGludCBtb3VudElkKSB7Ci0gICAgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6dG9fc3RyaW5nKG1vdW50SWQpOwotCi0gICAgLy8gQ2hlY2sgbW91bnQgcG9pbnQgbmFtZS4KLSAgICBzdGQ6OnN0cmluZyBwYXRoOwotICAgIGlmIChnZXRNb3VudFBhdGgodWlkLCBuYW1lLCAmcGF0aCkgIT0gYW5kcm9pZDo6T0spIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBtb3VudCBwb2ludCBuYW1lIjsKLSAgICAgICAgcmV0dXJuIC0xOworaW50IFZvbHVtZU1hbmFnZXI6OmRlc3Ryb3lTdHViVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCkgeworICAgIGF1dG8gaSA9IG1TdHViVm9sdW1lcy5iZWdpbigpOworICAgIHdoaWxlIChpICE9IG1TdHViVm9sdW1lcy5lbmQoKSkgeworICAgICAgICBpZiAoKCppKS0+Z2V0SWQoKSA9PSB2b2xJZCkgeworICAgICAgICAgICAgKCppKS0+ZGVzdHJveSgpOworICAgICAgICAgICAgaSA9IG1TdHViVm9sdW1lcy5lcmFzZShpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CiAKLSAgICByZXR1cm4gcnVuQ29tbWFuZEluTmFtZXNwYWNlKCJ1bm1vdW50IiwgdWlkLCBwaWQsIHBhdGgsIC0xIC8qIGRldmljZV9mZCAqLyk7CitpbnQgVm9sdW1lTWFuYWdlcjo6bW91bnRBcHBGdXNlKHVpZF90IHVpZCwgaW50IG1vdW50SWQsIHVuaXF1ZV9mZCogZGV2aWNlX2ZkKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OnZvbGQ6Ok1vdW50QXBwRnVzZSh1aWQsIG1vdW50SWQsIGRldmljZV9mZCk7Cit9CisKK2ludCBWb2x1bWVNYW5hZ2VyOjp1bm1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OnZvbGQ6OlVubW91bnRBcHBGdXNlKHVpZCwgbW91bnRJZCk7Cit9CisKK2ludCBWb2x1bWVNYW5hZ2VyOjpvcGVuQXBwRnVzZUZpbGUodWlkX3QgdWlkLCBpbnQgbW91bnRJZCwgaW50IGZpbGVJZCwgaW50IGZsYWdzKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OnZvbGQ6Ok9wZW5BcHBGdXNlRmlsZSh1aWQsIG1vdW50SWQsIGZpbGVJZCwgZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvVm9sdW1lTWFuYWdlci5oIGIvVm9sdW1lTWFuYWdlci5oCmluZGV4IGZiNDU1ZDguLjkyMjc4MTkgMTAwNjQ0Ci0tLSBhL1ZvbHVtZU1hbmFnZXIuaAorKysgYi9Wb2x1bWVNYW5hZ2VyLmgKQEAgLTE3LDggKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9WT0xEX1ZPTFVNRV9NQU5BR0VSX0gKICNkZWZpbmUgQU5EUk9JRF9WT0xEX1ZPTFVNRV9NQU5BR0VSX0gKIAotI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaW5jbHVkZSA8bGlzdD4KQEAgLTI5LDI0ICsyOSwyMiBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KKyNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rRXZlbnQuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8c3lzdXRpbHMvTmV0bGlua0V2ZW50Lmg+CiAKICNpbmNsdWRlICJhbmRyb2lkL29zL0lWb2xkTGlzdGVuZXIuaCIKIAogI2luY2x1ZGUgIm1vZGVsL0Rpc2suaCIKICNpbmNsdWRlICJtb2RlbC9Wb2x1bWVCYXNlLmgiCiAKLSNkZWZpbmUgREVCVUdfQVBQRlVTRSAwCi0KIGNsYXNzIFZvbHVtZU1hbmFnZXIgewotcHJpdmF0ZToKLSAgICBzdGF0aWMgVm9sdW1lTWFuYWdlciAqc0luc3RhbmNlOworICBwcml2YXRlOgorICAgIHN0YXRpYyBWb2x1bWVNYW5hZ2VyKiBzSW5zdGFuY2U7CiAKLSAgICBib29sICAgICAgICAgICAgICAgICAgIG1EZWJ1ZzsKKyAgICBib29sIG1EZWJ1ZzsKIAotcHVibGljOgorICBwdWJsaWM6CiAgICAgdmlydHVhbCB+Vm9sdW1lTWFuYWdlcigpOwogCiAgICAgLy8gVE9ETzogcGlwZSBhbGwgcmVxdWVzdHMgdGhyb3VnaCBWTSB0byBhdm9pZCBleHBvc2luZyB0aGlzIGxvY2sKQEAgLTU5LDEzICs1NywxMiBAQAogICAgIGludCBzdGFydCgpOwogICAgIGludCBzdG9wKCk7CiAKLSAgICB2b2lkIGhhbmRsZUJsb2NrRXZlbnQoTmV0bGlua0V2ZW50ICpldnQpOworICAgIHZvaWQgaGFuZGxlQmxvY2tFdmVudChOZXRsaW5rRXZlbnQqIGV2dCk7CiAKICAgICBjbGFzcyBEaXNrU291cmNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIERpc2tTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN5c1BhdHRlcm4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuaWNrbmFtZSwgaW50IGZsYWdzKSA6Ci0gICAgICAgICAgICAgICAgbVN5c1BhdHRlcm4oc3lzUGF0dGVybiksIG1OaWNrbmFtZShuaWNrbmFtZSksIG1GbGFncyhmbGFncykgewotICAgICAgICB9CisgICAgICBwdWJsaWM6CisgICAgICAgIERpc2tTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN5c1BhdHRlcm4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuaWNrbmFtZSwgaW50IGZsYWdzKQorICAgICAgICAgICAgOiBtU3lzUGF0dGVybihzeXNQYXR0ZXJuKSwgbU5pY2tuYW1lKG5pY2tuYW1lKSwgbUZsYWdzKGZsYWdzKSB7fQogCiAgICAgICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzdGQ6OnN0cmluZyYgc3lzUGF0aCkgewogICAgICAgICAgICAgcmV0dXJuICFmbm1hdGNoKG1TeXNQYXR0ZXJuLmNfc3RyKCksIHN5c1BhdGguY19zdHIoKSwgMCk7CkBAIC03NCw3ICs3MSw3IEBACiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXROaWNrbmFtZSgpIHsgcmV0dXJuIG1OaWNrbmFtZTsgfQogICAgICAgICBpbnQgZ2V0RmxhZ3MoKSB7IHJldHVybiBtRmxhZ3M7IH0KIAotICAgIHByaXZhdGU6CisgICAgICBwcml2YXRlOgogICAgICAgICBzdGQ6OnN0cmluZyBtU3lzUGF0dGVybjsKICAgICAgICAgc3RkOjpzdHJpbmcgbU5pY2tuYW1lOwogICAgICAgICBpbnQgbUZsYWdzOwpAQCAtMTEwLDcgKzEwNyw3IEBACiAgICAgaW50IHVwZGF0ZVZpcnR1YWxEaXNrKCk7CiAgICAgaW50IHNldERlYnVnKGJvb2wgZW5hYmxlKTsKIAotICAgIHN0YXRpYyBWb2x1bWVNYW5hZ2VyICpJbnN0YW5jZSgpOworICAgIHN0YXRpYyBWb2x1bWVNYW5hZ2VyKiBJbnN0YW5jZSgpOwogCiAgICAgLyoKICAgICAgKiBFbnN1cmUgdGhhdCBhbGwgZGlyZWN0b3JpZXMgYWxvbmcgZ2l2ZW4gcGF0aCBleGlzdCwgY3JlYXRpbmcgcGFyZW50CkBAIC0xMjIsMTMgKzExOSwxOSBAQAogICAgIGludCBta2RpcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwogCiAgICAgaW50IGNyZWF0ZU9iYihjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50MzJfdCBvd25lckdpZCwKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRWb2xJZCk7CisgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0Vm9sSWQpOwogICAgIGludCBkZXN0cm95T2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCk7CiAKLSAgICBpbnQgbW91bnRBcHBGdXNlKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBpbnQgbW91bnRJZCwgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBkZXZpY2VfZmQpOwotICAgIGludCB1bm1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIHBpZF90IHBpZCwgaW50IG1vdW50SWQpOworICAgIGludCBjcmVhdGVTdHViVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1R5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzTGFiZWwsIHN0ZDo6c3RyaW5nKiBvdXRWb2xJZCk7CisgICAgaW50IGRlc3Ryb3lTdHViVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCk7CiAKLXByaXZhdGU6CisgICAgaW50IG1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCk7CisgICAgaW50IHVubW91bnRBcHBGdXNlKHVpZF90IHVpZCwgaW50IG1vdW50SWQpOworICAgIGludCBvcGVuQXBwRnVzZUZpbGUodWlkX3QgdWlkLCBpbnQgbW91bnRJZCwgaW50IGZpbGVJZCwgaW50IGZsYWdzKTsKKworICBwcml2YXRlOgogICAgIFZvbHVtZU1hbmFnZXIoKTsKICAgICB2b2lkIHJlYWRJbml0aWFsU3RhdGUoKTsKIApAQCAtMTQ3LDYgKzE1MCw3IEBACiAgICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpEaXNrPj4gbURpc2tzOwogICAgIHN0ZDo6bGlzdDxzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6dm9sZDo6RGlzaz4+IG1QZW5kaW5nRGlza3M7CiAgICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpWb2x1bWVCYXNlPj4gbU9iYlZvbHVtZXM7CisgICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpWb2x1bWVCYXNlPj4gbVN0dWJWb2x1bWVzOwogCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVzZXJpZF90LCBpbnQ+IG1BZGRlZFVzZXJzOwogICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1c2VyaWRfdD4gbVN0YXJ0ZWRVc2VyczsKQEAgLTE1Nyw2ICsxNjEsNyBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpWb2x1bWVCYXNlPiBtUHJpbWFyeTsKIAogICAgIGludCBtTmV4dE9iYklkOworICAgIGludCBtTmV4dFN0dWJWb2x1bWVJZDsKICAgICBib29sIG1TZWN1cmVLZXlndWFyZFNob3dpbmc7CiB9OwogCmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9vcy9JVm9sZC5haWRsIGIvYmluZGVyL2FuZHJvaWQvb3MvSVZvbGQuYWlkbAppbmRleCA4MzAwYThlLi45NzZlYWIxIDEwMDY0NAotLS0gYS9iaW5kZXIvYW5kcm9pZC9vcy9JVm9sZC5haWRsCisrKyBiL2JpbmRlci9hbmRyb2lkL29zL0lWb2xkLmFpZGwKQEAgLTQ0LDIyICs0NCwyMiBAQAogICAgIHZvaWQgY2hlY2tFbmNyeXB0aW9uKEB1dGY4SW5DcHAgU3RyaW5nIHZvbElkKTsKIAogICAgIHZvaWQgbW92ZVN0b3JhZ2UoQHV0ZjhJbkNwcCBTdHJpbmcgZnJvbVZvbElkLCBAdXRmOEluQ3BwIFN0cmluZyB0b1ZvbElkLAotICAgICAgICAgICAgSVZvbGRUYXNrTGlzdGVuZXIgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICAgSVZvbGRUYXNrTGlzdGVuZXIgbGlzdGVuZXIpOwogCiAgICAgdm9pZCByZW1vdW50VWlkKGludCB1aWQsIGludCByZW1vdW50TW9kZSk7CiAKICAgICB2b2lkIG1rZGlycyhAdXRmOEluQ3BwIFN0cmluZyBwYXRoKTsKIAotICAgIEB1dGY4SW5DcHAgU3RyaW5nIGNyZWF0ZU9iYihAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VQYXRoLAotICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgc291cmNlS2V5LCBpbnQgb3duZXJHaWQpOworICAgIEB1dGY4SW5DcHAgU3RyaW5nIGNyZWF0ZU9iYihAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VQYXRoLCBAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvd25lckdpZCk7CiAgICAgdm9pZCBkZXN0cm95T2JiKEB1dGY4SW5DcHAgU3RyaW5nIHZvbElkKTsKIAogICAgIHZvaWQgZnN0cmltKGludCBmc3RyaW1GbGFncywgSVZvbGRUYXNrTGlzdGVuZXIgbGlzdGVuZXIpOwogICAgIHZvaWQgcnVuSWRsZU1haW50KElWb2xkVGFza0xpc3RlbmVyIGxpc3RlbmVyKTsKICAgICB2b2lkIGFib3J0SWRsZU1haW50KElWb2xkVGFza0xpc3RlbmVyIGxpc3RlbmVyKTsKIAotICAgIEZpbGVEZXNjcmlwdG9yIG1vdW50QXBwRnVzZShpbnQgdWlkLCBpbnQgcGlkLCBpbnQgbW91bnRJZCk7Ci0gICAgdm9pZCB1bm1vdW50QXBwRnVzZShpbnQgdWlkLCBpbnQgcGlkLCBpbnQgbW91bnRJZCk7CisgICAgRmlsZURlc2NyaXB0b3IgbW91bnRBcHBGdXNlKGludCB1aWQsIGludCBtb3VudElkKTsKKyAgICB2b2lkIHVubW91bnRBcHBGdXNlKGludCB1aWQsIGludCBtb3VudElkKTsKIAogICAgIHZvaWQgZmRlQ2hlY2tQYXNzd29yZChAdXRmOEluQ3BwIFN0cmluZyBwYXNzd29yZCk7CiAgICAgdm9pZCBmZGVSZXN0YXJ0KCk7CkBAIC04NCwxNSArODQsMzQgQEAKICAgICB2b2lkIGNyZWF0ZVVzZXJLZXkoaW50IHVzZXJJZCwgaW50IHVzZXJTZXJpYWwsIGJvb2xlYW4gZXBoZW1lcmFsKTsKICAgICB2b2lkIGRlc3Ryb3lVc2VyS2V5KGludCB1c2VySWQpOwogCi0gICAgdm9pZCBhZGRVc2VyS2V5QXV0aChpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgQHV0ZjhJbkNwcCBTdHJpbmcgdG9rZW4sIEB1dGY4SW5DcHAgU3RyaW5nIHNlY3JldCk7CisgICAgdm9pZCBhZGRVc2VyS2V5QXV0aChpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgQHV0ZjhJbkNwcCBTdHJpbmcgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBzZWNyZXQpOwogICAgIHZvaWQgZml4YXRlTmV3ZXN0VXNlcktleUF1dGgoaW50IHVzZXJJZCk7CiAKLSAgICB2b2lkIHVubG9ja1VzZXJLZXkoaW50IHVzZXJJZCwgaW50IHVzZXJTZXJpYWwsIEB1dGY4SW5DcHAgU3RyaW5nIHRva2VuLCBAdXRmOEluQ3BwIFN0cmluZyBzZWNyZXQpOworICAgIHZvaWQgdW5sb2NrVXNlcktleShpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgQHV0ZjhJbkNwcCBTdHJpbmcgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIHNlY3JldCk7CiAgICAgdm9pZCBsb2NrVXNlcktleShpbnQgdXNlcklkKTsKIAotICAgIHZvaWQgcHJlcGFyZVVzZXJTdG9yYWdlKEBudWxsYWJsZSBAdXRmOEluQ3BwIFN0cmluZyB1dWlkLCBpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgaW50IHN0b3JhZ2VGbGFncyk7CisgICAgdm9pZCBwcmVwYXJlVXNlclN0b3JhZ2UoQG51bGxhYmxlIEB1dGY4SW5DcHAgU3RyaW5nIHV1aWQsIGludCB1c2VySWQsIGludCB1c2VyU2VyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9yYWdlRmxhZ3MpOwogICAgIHZvaWQgZGVzdHJveVVzZXJTdG9yYWdlKEBudWxsYWJsZSBAdXRmOEluQ3BwIFN0cmluZyB1dWlkLCBpbnQgdXNlcklkLCBpbnQgc3RvcmFnZUZsYWdzKTsKIAorICAgIHZvaWQgc3RhcnRDaGVja3BvaW50KGludCByZXRyeSk7CisgICAgYm9vbGVhbiBuZWVkc0NoZWNrcG9pbnQoKTsKKyAgICBib29sZWFuIG5lZWRzUm9sbGJhY2soKTsKKyAgICB2b2lkIGFib3J0Q2hhbmdlcygpOworICAgIHZvaWQgY29tbWl0Q2hhbmdlcygpOworICAgIHZvaWQgcHJlcGFyZUNoZWNrcG9pbnQoKTsKKyAgICB2b2lkIHJlc3RvcmVDaGVja3BvaW50KEB1dGY4SW5DcHAgU3RyaW5nIGRldmljZSk7CisgICAgdm9pZCBtYXJrQm9vdEF0dGVtcHQoKTsKKworICAgIEB1dGY4SW5DcHAgU3RyaW5nIGNyZWF0ZVN0dWJWb2x1bWUoQHV0ZjhJbkNwcCBTdHJpbmcgc291cmNlUGF0aCwKKyAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIG1vdW50UGF0aCwgQHV0ZjhJbkNwcCBTdHJpbmcgZnNUeXBlLAorICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgZnNVdWlkLCBAdXRmOEluQ3BwIFN0cmluZyBmc0xhYmVsKTsKKyAgICB2b2lkIGRlc3Ryb3lTdHViVm9sdW1lKEB1dGY4SW5DcHAgU3RyaW5nIHZvbElkKTsKKworICAgIEZpbGVEZXNjcmlwdG9yIG9wZW5BcHBGdXNlRmlsZShpbnQgdWlkLCBpbnQgbW91bnRJZCwgaW50IGZpbGVJZCwgaW50IGZsYWdzKTsKKwogICAgIGNvbnN0IGludCBFTkNSWVBUSU9OX0ZMQUdfTk9fVUkgPSA0OwogCiAgICAgY29uc3QgaW50IEVOQ1JZUFRJT05fU1RBVEVfTk9ORSA9IDE7CkBAIC0xMTMsOCArMTMyLDggQEAKIAogICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX1BBU1NXT1JEID0gMDsKICAgICBjb25zdCBpbnQgUEFTU1dPUkRfVFlQRV9ERUZBVUxUID0gMTsKLSAgICBjb25zdCBpbnQgUEFTU1dPUkRfVFlQRV9QSU4gPSAyOwotICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX1BBVFRFUk4gPSAzOworICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX1BBVFRFUk4gPSAyOworICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX1BJTiA9IDM7CiAKICAgICBjb25zdCBpbnQgU1RPUkFHRV9GTEFHX0RFID0gMTsKICAgICBjb25zdCBpbnQgU1RPUkFHRV9GTEFHX0NFID0gMjsKQEAgLTEzOSw0ICsxNTgsNSBAQAogICAgIGNvbnN0IGludCBWT0xVTUVfVFlQRV9FTVVMQVRFRCA9IDI7CiAgICAgY29uc3QgaW50IFZPTFVNRV9UWVBFX0FTRUMgPSAzOwogICAgIGNvbnN0IGludCBWT0xVTUVfVFlQRV9PQkIgPSA0OworICAgIGNvbnN0IGludCBWT0xVTUVfVFlQRV9TVFVCID0gNTsKIH0KZGlmZiAtLWdpdCBhL2NyeXB0ZnMuY3BwIGIvY3J5cHRmcy5jcHAKaW5kZXggYzUwMjRhZS4uNWJlMjliZSAxMDA2NDQKLS0tIGEvY3J5cHRmcy5jcHAKKysrIGIvY3J5cHRmcy5jcHAKQEAgLTIwLDUzICsyMCw2MiBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KLSNpbmNsdWRlIDxsaWJnZW4uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNkZWZpbmUgTE9HX1RBRyAiQ3J5cHRmcyIKKworI2luY2x1ZGUgImNyeXB0ZnMuaCIKKworI2luY2x1ZGUgIkNoZWNrcG9pbnQuaCIKKyNpbmNsdWRlICJFbmNyeXB0SW5wbGFjZS5oIgorI2luY2x1ZGUgIkZzQ3J5cHQuaCIKKyNpbmNsdWRlICJLZXltYXN0ZXIuaCIKKyNpbmNsdWRlICJQcm9jZXNzLmgiCisjaW5jbHVkZSAiU2NyeXB0UGFyYW1ldGVycy5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisjaW5jbHVkZSAiVm9sZFV0aWwuaCIKKyNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAic2Vjb250ZXh0LmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJvb3Rsb2FkZXJfbWVzc2FnZS9ib290bG9hZGVyX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYW5kcm9pZF9yZWJvb3QuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgorI2luY2x1ZGUgPGYyZnNfc3BhcnNlYmxvY2suaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KKyNpbmNsdWRlIDxmc2NyeXB0L2ZzY3J5cHQuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+Ci0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X3V0aWxzLmg+Ci0jaW5jbHVkZSA8bGludXgva2Rldl90Lmg+Ci0jaW5jbHVkZSA8ZnNfbWdyLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KLSNpbmNsdWRlICJjcnlwdGZzLmgiCi0jaW5jbHVkZSAic2Vjb250ZXh0LmgiCi0jZGVmaW5lIExPR19UQUcgIkNyeXB0ZnMiCi0jaW5jbHVkZSAiY3V0aWxzL2xvZy5oIgotI2luY2x1ZGUgImN1dGlscy9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiY3V0aWxzL2FuZHJvaWRfcmVib290LmgiCi0jaW5jbHVkZSAiaGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmgiCi0jaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+Ci0jaW5jbHVkZSAiU2NyeXB0UGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKLSNpbmNsdWRlICJWb2xkVXRpbC5oIgotI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgotI2luY2x1ZGUgImYyZnNfc3BhcnNlYmxvY2suaCIKLSNpbmNsdWRlICJFbmNyeXB0SW5wbGFjZS5oIgotI2luY2x1ZGUgIlByb2Nlc3MuaCIKLSNpbmNsdWRlICJLZXltYXN0ZXIuaCIKLSNpbmNsdWRlICJhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgPGJvb3Rsb2FkZXJfbWVzc2FnZS9ib290bG9hZGVyX21lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiBleHRlcm4gIkMiIHsKICNpbmNsdWRlIDxjcnlwdG9fc2NyeXB0Lmg+CiB9CiAKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKwogI2RlZmluZSBVTlVTRUQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKIAogI2RlZmluZSBETV9DUllQVF9CVUZfU0laRSA0MDk2CkBAIC03NSwxNCArODQsMTIgQEAKIAogY29uc3RleHByIHNpemVfdCBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyA9IDE2OwogY29uc3RleHByIHNpemVfdCBJTlRFUk1FRElBVEVfSVZfTEVOX0JZVEVTID0gMTY7Ci1jb25zdGV4cHIgc2l6ZV90IElOVEVSTUVESUFURV9CVUZfU0laRSA9Ci0gICAgKElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTICsgSU5URVJNRURJQVRFX0lWX0xFTl9CWVRFUyk7Citjb25zdGV4cHIgc2l6ZV90IElOVEVSTUVESUFURV9CVUZfU0laRSA9IChJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyArIElOVEVSTUVESUFURV9JVl9MRU5fQllURVMpOwogCiAvLyBTQ1JZUFRfTEVOIGlzIHVzZWQgYnkgc3RydWN0IGNyeXB0X21udF9mdHIgZm9yIGl0cyBpbnRlcm1lZGlhdGUga2V5Lgotc3RhdGljX2Fzc2VydChJTlRFUk1FRElBVEVfQlVGX1NJWkUgPT0gU0NSWVBUX0xFTiwKLSAgICAgICAgICAgICAgIk1pc21hdGNoIG9mIGludGVybWVkaWF0ZSBrZXkgc2l6ZXMiKTsKK3N0YXRpY19hc3NlcnQoSU5URVJNRURJQVRFX0JVRl9TSVpFID09IFNDUllQVF9MRU4sICJNaXNtYXRjaCBvZiBpbnRlcm1lZGlhdGUga2V5IHNpemVzIik7CiAKLSNkZWZpbmUgS0VZX0lOX0ZPT1RFUiAgImZvb3RlciIKKyNkZWZpbmUgS0VZX0lOX0ZPT1RFUiAiZm9vdGVyIgogCiAjZGVmaW5lIERFRkFVTFRfUEFTU1dPUkQgImRlZmF1bHRfcGFzc3dvcmQiCiAKQEAgLTEwOCwyNyArMTE1LDI1IEBACiBzdGF0aWMgaW50IHB1dF9jcnlwdF9mdHJfYW5kX2tleShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyKTsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgc2F2ZWRfbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07Ci1zdGF0aWMgY2hhciAqc2F2ZWRfbW91bnRfcG9pbnQ7Ci1zdGF0aWMgaW50ICBtYXN0ZXJfa2V5X3NhdmVkID0gMDsKLXN0YXRpYyBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhICpwZXJzaXN0X2RhdGEgPSBOVUxMOworc3RhdGljIGNoYXIqIHNhdmVkX21vdW50X3BvaW50Oworc3RhdGljIGludCBtYXN0ZXJfa2V5X3NhdmVkID0gMDsKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhKiBwZXJzaXN0X2RhdGEgPSBOVUxMOwogCiAvKiBTaG91bGQgd2UgdXNlIGtleW1hc3Rlcj8gKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHkoKQoteworc3RhdGljIGludCBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSgpIHsKICAgICByZXR1cm4ga2V5bWFzdGVyX2NvbXBhdGliaWxpdHlfY3J5cHRmc19zY3J5cHQoKTsKIH0KIAogLyogQ3JlYXRlIGEgbmV3IGtleW1hc3RlciBrZXkgYW5kIHN0b3JlIGl0IGluIHRoaXMgZm9vdGVyICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9jcmVhdGVfa2V5KHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9jcmVhdGVfa2V5KHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIpIHsKICAgICBpZiAoZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplKSB7CiAgICAgICAgIFNMT0dJKCJBbHJlYWR5IGhhdmUga2V5Iik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGludCByYyA9IGtleW1hc3Rlcl9jcmVhdGVfa2V5X2Zvcl9jcnlwdGZzX3NjcnlwdChSU0FfS0VZX1NJWkUsIFJTQV9FWFBPTkVOVCwKLSAgICAgICAgICAgIEtFWU1BU1RFUl9DUllQVEZTX1JBVEVfTElNSVQsIGZ0ci0+a2V5bWFzdGVyX2Jsb2IsIEtFWU1BU1RFUl9CTE9CX1NJWkUsCi0gICAgICAgICAgICAmZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplKTsKKyAgICBpbnQgcmMgPSBrZXltYXN0ZXJfY3JlYXRlX2tleV9mb3JfY3J5cHRmc19zY3J5cHQoCisgICAgICAgIFJTQV9LRVlfU0laRSwgUlNBX0VYUE9ORU5ULCBLRVlNQVNURVJfQ1JZUFRGU19SQVRFX0xJTUlULCBmdHItPmtleW1hc3Rlcl9ibG9iLAorICAgICAgICBLRVlNQVNURVJfQkxPQl9TSVpFLCAmZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplKTsKICAgICBpZiAocmMpIHsKICAgICAgICAgaWYgKGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSA+IEtFWU1BU1RFUl9CTE9CX1NJWkUpIHsKICAgICAgICAgICAgIFNMT0dFKCJLZXltYXN0ZXIga2V5IGJsb2IgdG9vIGxhcmdlIik7CkBAIC0xNDEsMTIgKzE0Niw5IEBACiB9CiAKIC8qIFRoaXMgc2lnbnMgdGhlIGdpdmVuIG9iamVjdCB1c2luZyB0aGUga2V5bWFzdGVyIGtleS4gKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX3NpZ25fb2JqZWN0KHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgb2JqZWN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqc2lnbmF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzaWduYXR1cmVfc2l6ZSkKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX3NpZ25fb2JqZWN0KHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvYmplY3Rfc2l6ZSwgdW5zaWduZWQgY2hhcioqIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogc2lnbmF0dXJlX3NpemUpIHsKICAgICB1bnNpZ25lZCBjaGFyIHRvX3NpZ25bUlNBX0tFWV9TSVpFX0JZVEVTXTsKICAgICBzaXplX3QgdG9fc2lnbl9zaXplID0gc2l6ZW9mKHRvX3NpZ24pOwogICAgIG1lbXNldCh0b19zaWduLCAwLCBSU0FfS0VZX1NJWkVfQllURVMpOwpAQCAtMjI1LDIxICsyMjcsMjAgQEAKIHN0YXRpYyBpbnQgcGFzc3dvcmRfZXhwaXJ5X3RpbWUgPSAwOwogc3RhdGljIGNvbnN0IGludCBwYXNzd29yZF9tYXhfYWdlX3NlY29uZHMgPSA2MDsKIAotZW51bSBjbGFzcyBSZWJvb3RUeXBlIHtyZWJvb3QsIHJlY292ZXJ5LCBzaHV0ZG93bn07Ci1zdGF0aWMgdm9pZCBjcnlwdGZzX3JlYm9vdChSZWJvb3RUeXBlIHJ0KQotewotICBzd2l0Y2ggKHJ0KSB7Ci0gICAgICBjYXNlIFJlYm9vdFR5cGU6OnJlYm9vdDoKLSAgICAgICAgICBwcm9wZXJ0eV9zZXQoQU5EUk9JRF9SQl9QUk9QRVJUWSwgInJlYm9vdCIpOwotICAgICAgICAgIGJyZWFrOworZW51bSBjbGFzcyBSZWJvb3RUeXBlIHsgcmVib290LCByZWNvdmVyeSwgc2h1dGRvd24gfTsKK3N0YXRpYyB2b2lkIGNyeXB0ZnNfcmVib290KFJlYm9vdFR5cGUgcnQpIHsKKyAgICBzd2l0Y2ggKHJ0KSB7CisgICAgICAgIGNhc2UgUmVib290VHlwZTo6cmVib290OgorICAgICAgICAgICAgcHJvcGVydHlfc2V0KEFORFJPSURfUkJfUFJPUEVSVFksICJyZWJvb3QiKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIFJlYm9vdFR5cGU6OnJlY292ZXJ5OgotICAgICAgICAgIHByb3BlcnR5X3NldChBTkRST0lEX1JCX1BST1BFUlRZLCAicmVib290LHJlY292ZXJ5Iik7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUmVib290VHlwZTo6cmVjb3Zlcnk6CisgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoQU5EUk9JRF9SQl9QUk9QRVJUWSwgInJlYm9vdCxyZWNvdmVyeSIpOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgUmVib290VHlwZTo6c2h1dGRvd246Ci0gICAgICAgICAgcHJvcGVydHlfc2V0KEFORFJPSURfUkJfUFJPUEVSVFksICJzaHV0ZG93biIpOwotICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJlYm9vdFR5cGU6OnNodXRkb3duOgorICAgICAgICAgICAgcHJvcGVydHlfc2V0KEFORFJPSURfUkJfUFJPUEVSVFksICJzaHV0ZG93biIpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgc2xlZXAoMjApOwpAQCAtMjQ4LDggKzI0OSw3IEBACiAgICAgcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBpb2N0bF9pbml0KHN0cnVjdCBkbV9pb2N0bCAqaW8sIHNpemVfdCBkYXRhU2l6ZSwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgZmxhZ3MpCi17CitzdGF0aWMgdm9pZCBpb2N0bF9pbml0KHN0cnVjdCBkbV9pb2N0bCogaW8sIHNpemVfdCBkYXRhU2l6ZSwgY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgZmxhZ3MpIHsKICAgICBtZW1zZXQoaW8sIDAsIGRhdGFTaXplKTsKICAgICBpby0+ZGF0YV9zaXplID0gZGF0YVNpemU7CiAgICAgaW8tPmRhdGFfc3RhcnQgPSBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogc3RydWN0IENyeXB0b1R5cGU7CiAKIC8vIFVzZSB0byBnZXQgdGhlIENyeXB0b1R5cGUgaW4gdXNlIG9uIHRoaXMgZGV2aWNlLgotY29uc3QgQ3J5cHRvVHlwZSAmZ2V0X2NyeXB0b190eXBlKCk7Citjb25zdCBDcnlwdG9UeXBlJiBnZXRfY3J5cHRvX3R5cGUoKTsKIAogc3RydWN0IENyeXB0b1R5cGUgewogICAgIC8vIFdlIHNob3VsZCBvbmx5IGJlIGNvbnN0cnVjdGluZyBDcnlwdG9UeXBlcyBhcyBwYXJ0IG9mCkBAIC0yNzksNjAgKzI3OSw2MCBAQAogICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlIHNldF9rZXlzaXplKHVpbnQzMl90IHNpemUpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIENyeXB0b1R5cGUodGhpcy0+cHJvcGVydHlfbmFtZSwgdGhpcy0+Y3J5cHRvX25hbWUsIHNpemUpOwogICAgIH0KLSAgICBjb25zdGV4cHIgQ3J5cHRvVHlwZSBzZXRfcHJvcGVydHlfbmFtZShjb25zdCBjaGFyICpwcm9wZXJ0eSkgY29uc3QgeworICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlIHNldF9wcm9wZXJ0eV9uYW1lKGNvbnN0IGNoYXIqIHByb3BlcnR5KSBjb25zdCB7CiAgICAgICAgIHJldHVybiBDcnlwdG9UeXBlKHByb3BlcnR5LCB0aGlzLT5jcnlwdG9fbmFtZSwgdGhpcy0+a2V5c2l6ZSk7CiAgICAgfQotICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlIHNldF9jcnlwdG9fbmFtZShjb25zdCBjaGFyICpjcnlwdG8pIGNvbnN0IHsKKyAgICBjb25zdGV4cHIgQ3J5cHRvVHlwZSBzZXRfY3J5cHRvX25hbWUoY29uc3QgY2hhciogY3J5cHRvKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBDcnlwdG9UeXBlKHRoaXMtPnByb3BlcnR5X25hbWUsIGNyeXB0bywgdGhpcy0+a2V5c2l6ZSk7CiAgICAgfQogCi0gICAgY29uc3RleHByIGNvbnN0IGNoYXIgKmdldF9wcm9wZXJ0eV9uYW1lKCkgY29uc3QgeyByZXR1cm4gcHJvcGVydHlfbmFtZTsgfQotICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyICpnZXRfY3J5cHRvX25hbWUoKSBjb25zdCB7IHJldHVybiBjcnlwdG9fbmFtZTsgfQorICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBnZXRfcHJvcGVydHlfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHByb3BlcnR5X25hbWU7IH0KKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciogZ2V0X2NyeXB0b19uYW1lKCkgY29uc3QgeyByZXR1cm4gY3J5cHRvX25hbWU7IH0KICAgICBjb25zdGV4cHIgdWludDMyX3QgZ2V0X2tleXNpemUoKSBjb25zdCB7IHJldHVybiBrZXlzaXplOyB9CiAKLSBwcml2YXRlOgotICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWU7Ci0gICAgY29uc3QgY2hhciAqY3J5cHRvX25hbWU7CisgIHByaXZhdGU6CisgICAgY29uc3QgY2hhciogcHJvcGVydHlfbmFtZTsKKyAgICBjb25zdCBjaGFyKiBjcnlwdG9fbmFtZTsKICAgICB1aW50MzJfdCBrZXlzaXplOwogCi0gICAgY29uc3RleHByIENyeXB0b1R5cGUoY29uc3QgY2hhciAqcHJvcGVydHksIGNvbnN0IGNoYXIgKmNyeXB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrc2l6ZSkKKyAgICBjb25zdGV4cHIgQ3J5cHRvVHlwZShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogY3J5cHRvLCB1aW50MzJfdCBrc2l6ZSkKICAgICAgICAgOiBwcm9wZXJ0eV9uYW1lKHByb3BlcnR5KSwgY3J5cHRvX25hbWUoY3J5cHRvKSwga2V5c2l6ZShrc2l6ZSkge30KLSAgICBmcmllbmQgY29uc3QgQ3J5cHRvVHlwZSAmZ2V0X2NyeXB0b190eXBlKCk7Ci0gICAgc3RhdGljIGNvbnN0IENyeXB0b1R5cGUgJmdldF9kZXZpY2VfY3J5cHRvX2FsZ29yaXRobSgpOworICAgIGZyaWVuZCBjb25zdCBDcnlwdG9UeXBlJiBnZXRfY3J5cHRvX3R5cGUoKTsKKyAgICBzdGF0aWMgY29uc3QgQ3J5cHRvVHlwZSYgZ2V0X2RldmljZV9jcnlwdG9fYWxnb3JpdGhtKCk7CiB9OwogCiAvLyBXZSBvbmx5IHdhbnQgdG8gcGFyc2UgdGhpcyByZWFkLW9ubHkgcHJvcGVydHkgb25jZS4gIEJ1dCB3ZSBuZWVkIHRvIHdhaXQKIC8vIHVudGlsIHRoZSBzeXN0ZW0gaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHdlIGNhbiByZWFkIGl0LiAgU28gd2UgdXNlIGEgc3RhdGljCiAvLyBzY29wZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IGl0IG9ubHkgb25jZS4KLWNvbnN0IENyeXB0b1R5cGUgJmdldF9jcnlwdG9fdHlwZSgpIHsKK2NvbnN0IENyeXB0b1R5cGUmIGdldF9jcnlwdG9fdHlwZSgpIHsKICAgICBzdGF0aWMgQ3J5cHRvVHlwZSBjcnlwdG9fdHlwZSA9IENyeXB0b1R5cGU6OmdldF9kZXZpY2VfY3J5cHRvX2FsZ29yaXRobSgpOwogICAgIHJldHVybiBjcnlwdG9fdHlwZTsKIH0KIAogY29uc3RleHByIENyeXB0b1R5cGUgZGVmYXVsdF9jcnlwdG9fdHlwZSA9IENyeXB0b1R5cGUoKQotICAgIC5zZXRfcHJvcGVydHlfbmFtZSgiQUVTLTEyOC1DQkMiKQotICAgIC5zZXRfY3J5cHRvX25hbWUoImFlcy1jYmMtZXNzaXY6c2hhMjU2IikKLSAgICAuc2V0X2tleXNpemUoMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0X3Byb3BlcnR5X25hbWUoIkFFUy0xMjgtQ0JDIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldF9jcnlwdG9fbmFtZSgiYWVzLWNiYy1lc3NpdjpzaGEyNTYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0X2tleXNpemUoMTYpOwogCiBjb25zdGV4cHIgQ3J5cHRvVHlwZSBzdXBwb3J0ZWRfY3J5cHRvX3R5cGVzW10gPSB7CiAgICAgZGVmYXVsdF9jcnlwdG9fdHlwZSwKICAgICAvLyBBZGQgbmV3IENyeXB0b1R5cGVzIGhlcmUuICBPcmRlciBpcyBub3QgaW1wb3J0YW50LgogfTsKIAotCiAvLyAtLS0tLS0tLS0tIFNUQVJUIENPTVBJTEUtVElNRSBTQU5JVFkgQ0hFQ0sgQkxPQ0sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gV2UgY29uZmlybSBhbGwgc3VwcG9ydGVkX2NyeXB0b190eXBlcyBoYXZlIGEgc21hbGwgZW5vdWdoIGtleXNpemUgYW5kCiAvLyBoYWQgYm90aCBzZXRfcHJvcGVydHlfbmFtZSgpIGFuZCBzZXRfY3J5cHRvX25hbWUoKSBjYWxsZWQuCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNvbnN0ZXhwciBzaXplX3QgYXJyYXlfbGVuZ3RoKFQgKCYpW05dKSB7IHJldHVybiBOOyB9Citjb25zdGV4cHIgc2l6ZV90IGFycmF5X2xlbmd0aChUICgmKVtOXSkgeworICAgIHJldHVybiBOOworfQogCiBjb25zdGV4cHIgYm9vbCBpbmRleE91dE9mQm91bmRzRm9yQ3J5cHRvVHlwZXMoc2l6ZV90IGluZGV4KSB7CiAgICAgcmV0dXJuIChpbmRleCA+PSBhcnJheV9sZW5ndGgoc3VwcG9ydGVkX2NyeXB0b190eXBlcykpOwogfQogCi1jb25zdGV4cHIgYm9vbCBpc1ZhbGlkQ3J5cHRvVHlwZShjb25zdCBDcnlwdG9UeXBlICZjcnlwdG9fdHlwZSkgeworY29uc3RleHByIGJvb2wgaXNWYWxpZENyeXB0b1R5cGUoY29uc3QgQ3J5cHRvVHlwZSYgY3J5cHRvX3R5cGUpIHsKICAgICByZXR1cm4gKChjcnlwdG9fdHlwZS5nZXRfcHJvcGVydHlfbmFtZSgpICE9IG51bGxwdHIpICYmCiAgICAgICAgICAgICAoY3J5cHRvX3R5cGUuZ2V0X2NyeXB0b19uYW1lKCkgIT0gbnVsbHB0cikgJiYKICAgICAgICAgICAgIChjcnlwdG9fdHlwZS5nZXRfa2V5c2l6ZSgpIDw9IE1BWF9LRVlfTEVOKSk7CkBAIC0zNDMsOCArMzQzLDggQEAKIC8vIGJ1dCBpdCdzIGFzc2VydGluZyBhdCBjb21waWxlIHRpbWUgdGhhdCBhbGwgb2Ygb3VyIGtleSBsZW5ndGhzIGFyZSB2YWxpZC4KIGNvbnN0ZXhwciBib29sIHZhbGlkYXRlU3VwcG9ydGVkQ3J5cHRvVHlwZXMoc2l6ZV90IGluZGV4KSB7CiAgICAgcmV0dXJuIGluZGV4T3V0T2ZCb3VuZHNGb3JDcnlwdG9UeXBlcyhpbmRleCkgfHwKLSAgICAgICAgKGlzVmFsaWRDcnlwdG9UeXBlKHN1cHBvcnRlZF9jcnlwdG9fdHlwZXNbaW5kZXhdKSAmJgotICAgICAgICAgdmFsaWRhdGVTdXBwb3J0ZWRDcnlwdG9UeXBlcyhpbmRleCArIDEpKTsKKyAgICAgICAgICAgKGlzVmFsaWRDcnlwdG9UeXBlKHN1cHBvcnRlZF9jcnlwdG9fdHlwZXNbaW5kZXhdKSAmJgorICAgICAgICAgICAgdmFsaWRhdGVTdXBwb3J0ZWRDcnlwdG9UeXBlcyhpbmRleCArIDEpKTsKIH0KIAogc3RhdGljX2Fzc2VydCh2YWxpZGF0ZVN1cHBvcnRlZENyeXB0b1R5cGVzKDApLApAQCAtMzUyLDM0ICszNTIsMzAgQEAKICAgICAgICAgICAgICAgImluY29tcGxldGVseSBjb25zdHJ1Y3RlZC4iKTsKIC8vICAtLS0tLS0tLS0tIEVORCBDT01QSUxFLVRJTUUgU0FOSVRZIENIRUNLIEJMT0NLIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotCiAvLyBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHksIHVzZSBnZXRfY3J5cHRvX3R5cGUoKSwgd2hpY2ggY2FjaGVzIHRoaXMgcmVzdWx0LgotY29uc3QgQ3J5cHRvVHlwZSAmQ3J5cHRvVHlwZTo6Z2V0X2RldmljZV9jcnlwdG9fYWxnb3JpdGhtKCkgeworY29uc3QgQ3J5cHRvVHlwZSYgQ3J5cHRvVHlwZTo6Z2V0X2RldmljZV9jcnlwdG9fYWxnb3JpdGhtKCkgewogICAgIGNvbnN0ZXhwciBjaGFyIENSWVBUX0FMR09fUFJPUFtdID0gInJvLmNyeXB0by5mZGVfYWxnb3JpdGhtIjsKICAgICBjaGFyIHBhcmFtc3RyW1BST1BFUlRZX1ZBTFVFX01BWF07CiAKLSAgICBwcm9wZXJ0eV9nZXQoQ1JZUFRfQUxHT19QUk9QLCBwYXJhbXN0ciwKLSAgICAgICAgICAgICAgICAgZGVmYXVsdF9jcnlwdG9fdHlwZS5nZXRfcHJvcGVydHlfbmFtZSgpKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJmN0eXBlIDogc3VwcG9ydGVkX2NyeXB0b190eXBlcykgeworICAgIHByb3BlcnR5X2dldChDUllQVF9BTEdPX1BST1AsIHBhcmFtc3RyLCBkZWZhdWx0X2NyeXB0b190eXBlLmdldF9wcm9wZXJ0eV9uYW1lKCkpOworICAgIGZvciAoYXV0byBjb25zdCYgY3R5cGUgOiBzdXBwb3J0ZWRfY3J5cHRvX3R5cGVzKSB7CiAgICAgICAgIGlmIChzdHJjbXAocGFyYW1zdHIsIGN0eXBlLmdldF9wcm9wZXJ0eV9uYW1lKCkpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBjdHlwZTsKICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HRSgiSW52YWxpZCBuYW1lICglcykgZm9yICVzLiAgRGVmYXVsdGluZyB0byAlc1xuIiwgcGFyYW1zdHIsCi0gICAgICAgICAgQ1JZUFRfQUxHT19QUk9QLCBkZWZhdWx0X2NyeXB0b190eXBlLmdldF9wcm9wZXJ0eV9uYW1lKCkpOworICAgIEFMT0dFKCJJbnZhbGlkIG5hbWUgKCVzKSBmb3IgJXMuICBEZWZhdWx0aW5nIHRvICVzXG4iLCBwYXJhbXN0ciwgQ1JZUFRfQUxHT19QUk9QLAorICAgICAgICAgIGRlZmF1bHRfY3J5cHRvX3R5cGUuZ2V0X3Byb3BlcnR5X25hbWUoKSk7CiAgICAgcmV0dXJuIGRlZmF1bHRfY3J5cHRvX3R5cGU7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCi0KLQogLyoqCiAgKiBHZXRzIHRoZSBkZWZhdWx0IGRldmljZSBzY3J5cHQgcGFyYW1ldGVycyBmb3Iga2V5IGRlcml2YXRpb24gdGltZSB0dW5pbmcuCiAgKiBUaGUgcGFyYW1ldGVycyBzaG91bGQgbGVhZCB0byBhYm91dCBvbmUgc2Vjb25kIGRlcml2YXRpb24gdGltZSBmb3IgdGhlCiAgKiBnaXZlbiBkZXZpY2UuCiAgKi8KLXN0YXRpYyB2b2lkIGdldF9kZXZpY2Vfc2NyeXB0X3BhcmFtcyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyKSB7CitzdGF0aWMgdm9pZCBnZXRfZGV2aWNlX3NjcnlwdF9wYXJhbXMoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0cikgewogICAgIGNoYXIgcGFyYW1zdHJbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBpbnQgTmYsIHJmLCBwZjsKIApAQCAtMzk3LDE3ICszOTMsMTYgQEAKICAgICByZXR1cm4gZ2V0X2NyeXB0b190eXBlKCkuZ2V0X2tleXNpemUoKTsKIH0KIAotY29uc3QgY2hhciAqY3J5cHRmc19nZXRfY3J5cHRvX25hbWUoKSB7Citjb25zdCBjaGFyKiBjcnlwdGZzX2dldF9jcnlwdG9fbmFtZSgpIHsKICAgICByZXR1cm4gZ2V0X2NyeXB0b190eXBlKCkuZ2V0X2NyeXB0b19uYW1lKCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2ZzX3NpemUoY2hhciAqZGV2KQoteworc3RhdGljIHVpbnQ2NF90IGdldF9mc19zaXplKGNoYXIqIGRldikgewogICAgIGludCBmZCwgYmxvY2tfc2l6ZTsKICAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayBzYjsKLSAgICBvZmY2NF90IGxlbjsKKyAgICB1aW50NjRfdCBsZW47CiAKLSAgICBpZiAoKGZkID0gb3BlbihkZXYsIE9fUkRPTkxZfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIGlmICgoZmQgPSBvcGVuKGRldiwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKSA8IDApIHsKICAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIGRldmljZSB0byBnZXQgZmlsZXN5c3RlbSBzaXplICIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC00MzAsNjggKzQyNSw1NyBAQAogICAgIH0KICAgICBibG9ja19zaXplID0gMTAyNCA8PCBzYi5zX2xvZ19ibG9ja19zaXplOwogICAgIC8qIGNvbXB1dGUgbGVuZ3RoIGluIGJ5dGVzICovCi0gICAgbGVuID0gKCAoKG9mZjY0X3Qpc2Iuc19ibG9ja3NfY291bnRfaGkgPDwgMzIpICsgc2Iuc19ibG9ja3NfY291bnRfbG8pICogYmxvY2tfc2l6ZTsKKyAgICBsZW4gPSAoKCh1aW50NjRfdClzYi5zX2Jsb2Nrc19jb3VudF9oaSA8PCAzMikgKyBzYi5zX2Jsb2Nrc19jb3VudF9sbykgKiBibG9ja19zaXplOwogCiAgICAgLyogcmV0dXJuIGxlbmd0aCBpbiBzZWN0b3JzICovCi0gICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpIChsZW4gLyA1MTIpOworICAgIHJldHVybiBsZW4gLyA1MTI7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2NyeXB0X2Z0cl9pbmZvKGNoYXIgKiptZXRhZGF0YV9mbmFtZSwgb2ZmNjRfdCAqb2ZmKQotewotICBzdGF0aWMgaW50IGNhY2hlZF9kYXRhID0gMDsKLSAgc3RhdGljIG9mZjY0X3QgY2FjaGVkX29mZiA9IDA7Ci0gIHN0YXRpYyBjaGFyIGNhY2hlZF9tZXRhZGF0YV9mbmFtZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gIiI7Ci0gIGludCBmZDsKLSAgY2hhciBrZXlfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gIGNoYXIgcmVhbF9ibGtkZXZbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgaW50IHJjID0gLTE7CitzdGF0aWMgaW50IGdldF9jcnlwdF9mdHJfaW5mbyhjaGFyKiogbWV0YWRhdGFfZm5hbWUsIG9mZjY0X3QqIG9mZikgeworICAgIHN0YXRpYyBpbnQgY2FjaGVkX2RhdGEgPSAwOworICAgIHN0YXRpYyB1aW50NjRfdCBjYWNoZWRfb2ZmID0gMDsKKyAgICBzdGF0aWMgY2hhciBjYWNoZWRfbWV0YWRhdGFfZm5hbWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9ICIiOworICAgIGNoYXIga2V5X2xvY1tQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNoYXIgcmVhbF9ibGtkZXZbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpbnQgcmMgPSAtMTsKIAotICBpZiAoIWNhY2hlZF9kYXRhKSB7Ci0gICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIGtleV9sb2MsIHJlYWxfYmxrZGV2LCBzaXplb2Yoa2V5X2xvYykpOworICAgIGlmICghY2FjaGVkX2RhdGEpIHsKKyAgICAgICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIGtleV9sb2MsIHJlYWxfYmxrZGV2LCBzaXplb2Yoa2V5X2xvYykpOwogCi0gICAgaWYgKCFzdHJjbXAoa2V5X2xvYywgS0VZX0lOX0ZPT1RFUikpIHsKLSAgICAgIGlmICggKGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRFdSfE9fQ0xPRVhFQykpIDwgMCkgewotICAgICAgICBTTE9HRSgiQ2Fubm90IG9wZW4gcmVhbCBibG9jayBkZXZpY2UgJXNcbiIsIHJlYWxfYmxrZGV2KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotCi0gICAgICB1bnNpZ25lZCBsb25nIG5yX3NlYyA9IDA7Ci0gICAgICBnZXRfYmxrZGV2X3NpemUoZmQsICZucl9zZWMpOwotICAgICAgaWYgKG5yX3NlYyAhPSAwKSB7Ci0gICAgICAgIC8qIElmIGl0J3MgYW4gZW5jcnlwdGVkIEFuZHJvaWQgcGFydGl0aW9uLCB0aGUgbGFzdCAxNiBLYnl0ZXMgY29udGFpbiB0aGUKLSAgICAgICAgICogZW5jcnlwdGlvbiBpbmZvIGZvb3RlciBhbmQga2V5LCBhbmQgcGxlbnR5IG9mIGJ5dGVzIHRvIHNwYXJlIGZvciBmdXR1cmUKLSAgICAgICAgICogZ3Jvd3RoLgotICAgICAgICAgKi8KLSAgICAgICAgc3RybGNweShjYWNoZWRfbWV0YWRhdGFfZm5hbWUsIHJlYWxfYmxrZGV2LCBzaXplb2YoY2FjaGVkX21ldGFkYXRhX2ZuYW1lKSk7Ci0gICAgICAgIGNhY2hlZF9vZmYgPSAoKG9mZjY0X3QpbnJfc2VjICogNTEyKSAtIENSWVBUX0ZPT1RFUl9PRkZTRVQ7Ci0gICAgICAgIGNhY2hlZF9kYXRhID0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNMT0dFKCJDYW5ub3QgZ2V0IHNpemUgb2YgYmxvY2sgZGV2aWNlICVzXG4iLCByZWFsX2Jsa2Rldik7Ci0gICAgICB9Ci0gICAgICBjbG9zZShmZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0cmxjcHkoY2FjaGVkX21ldGFkYXRhX2ZuYW1lLCBrZXlfbG9jLCBzaXplb2YoY2FjaGVkX21ldGFkYXRhX2ZuYW1lKSk7Ci0gICAgICBjYWNoZWRfb2ZmID0gMDsKLSAgICAgIGNhY2hlZF9kYXRhID0gMTsKKyAgICAgICAgaWYgKCFzdHJjbXAoa2V5X2xvYywgS0VZX0lOX0ZPT1RFUikpIHsKKyAgICAgICAgICAgIGlmIChhbmRyb2lkOjp2b2xkOjpHZXRCbG9ja0RldlNpemUocmVhbF9ibGtkZXYsICZjYWNoZWRfb2ZmKSA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIC8qIElmIGl0J3MgYW4gZW5jcnlwdGVkIEFuZHJvaWQgcGFydGl0aW9uLCB0aGUgbGFzdCAxNiBLYnl0ZXMgY29udGFpbiB0aGUKKyAgICAgICAgICAgICAgICAgKiBlbmNyeXB0aW9uIGluZm8gZm9vdGVyIGFuZCBrZXksIGFuZCBwbGVudHkgb2YgYnl0ZXMgdG8gc3BhcmUgZm9yIGZ1dHVyZQorICAgICAgICAgICAgICAgICAqIGdyb3d0aC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzdHJsY3B5KGNhY2hlZF9tZXRhZGF0YV9mbmFtZSwgcmVhbF9ibGtkZXYsIHNpemVvZihjYWNoZWRfbWV0YWRhdGFfZm5hbWUpKTsKKyAgICAgICAgICAgICAgICBjYWNoZWRfb2ZmIC09IENSWVBUX0ZPT1RFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgY2FjaGVkX2RhdGEgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTTE9HRSgiQ2Fubm90IGdldCBzaXplIG9mIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RybGNweShjYWNoZWRfbWV0YWRhdGFfZm5hbWUsIGtleV9sb2MsIHNpemVvZihjYWNoZWRfbWV0YWRhdGFfZm5hbWUpKTsKKyAgICAgICAgICAgIGNhY2hlZF9vZmYgPSAwOworICAgICAgICAgICAgY2FjaGVkX2RhdGEgPSAxOworICAgICAgICB9CiAgICAgfQotICB9CiAKLSAgaWYgKGNhY2hlZF9kYXRhKSB7Ci0gICAgaWYgKG1ldGFkYXRhX2ZuYW1lKSB7Ci0gICAgICAgICptZXRhZGF0YV9mbmFtZSA9IGNhY2hlZF9tZXRhZGF0YV9mbmFtZTsKKyAgICBpZiAoY2FjaGVkX2RhdGEpIHsKKyAgICAgICAgaWYgKG1ldGFkYXRhX2ZuYW1lKSB7CisgICAgICAgICAgICAqbWV0YWRhdGFfZm5hbWUgPSBjYWNoZWRfbWV0YWRhdGFfZm5hbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZikgeworICAgICAgICAgICAgKm9mZiA9IGNhY2hlZF9vZmY7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSAwOwogICAgIH0KLSAgICBpZiAob2ZmKSB7Ci0gICAgICAgICpvZmYgPSBjYWNoZWRfb2ZmOwotICAgIH0KLSAgICByYyA9IDA7Ci0gIH0KIAotICByZXR1cm4gcmM7CisgICAgcmV0dXJuIHJjOwogfQogCiAvKiBTZXQgc2hhMjU2IGNoZWNrc3VtIGluIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQgc2V0X2Z0cl9zaGEoc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikKLXsKK3N0YXRpYyB2b2lkIHNldF9mdHJfc2hhKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKICAgICBTSEEyNTZfQ1RYIGM7CiAgICAgU0hBMjU2X0luaXQoJmMpOwogICAgIG1lbXNldChjcnlwdF9mdHItPnNoYTI1NiwgMCwgc2l6ZW9mKGNyeXB0X2Z0ci0+c2hhMjU2KSk7CkBAIC01MDIsODIgKzQ4Niw3NiBAQAogLyoga2V5IG9yIHNhbHQgY2FuIGJlIE5VTEwsIGluIHdoaWNoIGNhc2UganVzdCBza2lwIHdyaXRpbmcgdGhhdCB2YWx1ZS4gIFVzZWZ1bCB0bwogICogdXBkYXRlIHRoZSBmYWlsZWQgbW91bnQgY291bnQgYnV0IG5vdCBjaGFuZ2UgdGhlIGtleS4KICAqLwotc3RhdGljIGludCBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikKLXsKLSAgaW50IGZkOwotICB1bnNpZ25lZCBpbnQgY250OwotICAvKiBzdGFydGluZ19vZmYgaXMgc2V0IHRvIHRoZSBTRUVLX1NFVCBvZmZzZXQKLSAgICogd2hlcmUgdGhlIGNyeXB0byBzdHJ1Y3R1cmUgc3RhcnRzCi0gICAqLwotICBvZmY2NF90IHN0YXJ0aW5nX29mZjsKLSAgaW50IHJjID0gLTE7Ci0gIGNoYXIgKmZuYW1lID0gTlVMTDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKK3N0YXRpYyBpbnQgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKKyAgICBpbnQgZmQ7CisgICAgdW5zaWduZWQgaW50IGNudDsKKyAgICAvKiBzdGFydGluZ19vZmYgaXMgc2V0IHRvIHRoZSBTRUVLX1NFVCBvZmZzZXQKKyAgICAgKiB3aGVyZSB0aGUgY3J5cHRvIHN0cnVjdHVyZSBzdGFydHMKKyAgICAgKi8KKyAgICBvZmY2NF90IHN0YXJ0aW5nX29mZjsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBjaGFyKiBmbmFtZSA9IE5VTEw7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKIAotICBzZXRfZnRyX3NoYShjcnlwdF9mdHIpOworICAgIHNldF9mdHJfc2hhKGNyeXB0X2Z0cik7CiAKLSAgaWYgKGdldF9jcnlwdF9mdHJfaW5mbygmZm5hbWUsICZzdGFydGluZ19vZmYpKSB7Ci0gICAgU0xPR0UoIlVuYWJsZSB0byBnZXQgY3J5cHRfZnRyX2luZm9cbiIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoZm5hbWVbMF0gIT0gJy8nKSB7Ci0gICAgU0xPR0UoIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIGNyeXB0byBrZXkgbG9jYXRpb25cbiIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoIChmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVR8T19DTE9FWEVDLCAwNjAwKSkgPCAwKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCBvcGVuIGZvb3RlciBmaWxlICVzIGZvciBwdXRcbiIsIGZuYW1lKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgY3J5cHQgZm9vdGVyICovCi0gIGlmIChsc2VlazY0KGZkLCBzdGFydGluZ19vZmYsIFNFRUtfU0VUKSA9PSAtMSkgewotICAgIFNMT0dFKCJDYW5ub3Qgc2VlayB0byByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOwotICAgIGdvdG8gZXJyb3V0OwotICB9Ci0KLSAgaWYgKChjbnQgPSB3cml0ZShmZCwgY3J5cHRfZnRyLCBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSkgIT0gc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkgewotICAgIFNMT0dFKCJDYW5ub3Qgd3JpdGUgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQotCi0gIGZzdGF0KGZkLCAmc3RhdGJ1Zik7Ci0gIC8qIElmIHRoZSBrZXlzIGFyZSBrZXB0IG9uIGEgcmF3IGJsb2NrIGRldmljZSwgZG8gbm90IHRyeSB0byB0cnVuY2F0ZSBpdC4gKi8KLSAgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkgewotICAgIGlmIChmdHJ1bmNhdGUoZmQsIDB4NDAwMCkpIHsKLSAgICAgIFNMT0dFKCJDYW5ub3Qgc2V0IGZvb3RlciBmaWxlIHNpemVcbiIpOwotICAgICAgZ290byBlcnJvdXQ7CisgICAgaWYgKGdldF9jcnlwdF9mdHJfaW5mbygmZm5hbWUsICZzdGFydGluZ19vZmYpKSB7CisgICAgICAgIFNMT0dFKCJVbmFibGUgdG8gZ2V0IGNyeXB0X2Z0cl9pbmZvXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgfQorICAgIGlmIChmbmFtZVswXSAhPSAnLycpIHsKKyAgICAgICAgU0xPR0UoIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIGNyeXB0byBrZXkgbG9jYXRpb25cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoZmQgPSBvcGVuKGZuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19DTE9FWEVDLCAwNjAwKSkgPCAwKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBmb290ZXIgZmlsZSAlcyBmb3IgcHV0XG4iLCBmbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLSAgLyogU3VjY2VzcyEgKi8KLSAgcmMgPSAwOworICAgIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjcnlwdCBmb290ZXIgKi8KKyAgICBpZiAobHNlZWs2NChmZCwgc3RhcnRpbmdfb2ZmLCBTRUVLX1NFVCkgPT0gLTEpIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCBzZWVrIHRvIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlclxuIik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KKworICAgIGlmICgoY250ID0gd3JpdGUoZmQsIGNyeXB0X2Z0ciwgc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkpICE9IHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCB3cml0ZSByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CisKKyAgICBmc3RhdChmZCwgJnN0YXRidWYpOworICAgIC8qIElmIHRoZSBrZXlzIGFyZSBrZXB0IG9uIGEgcmF3IGJsb2NrIGRldmljZSwgZG8gbm90IHRyeSB0byB0cnVuY2F0ZSBpdC4gKi8KKyAgICBpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpKSB7CisgICAgICAgIGlmIChmdHJ1bmNhdGUoZmQsIDB4NDAwMCkpIHsKKyAgICAgICAgICAgIFNMT0dFKCJDYW5ub3Qgc2V0IGZvb3RlciBmaWxlIHNpemVcbiIpOworICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTdWNjZXNzISAqLworICAgIHJjID0gMDsKIAogZXJyb3V0OgotICBjbG9zZShmZCk7Ci0gIHJldHVybiByYzsKLQorICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBib29sIGNoZWNrX2Z0cl9zaGEoY29uc3Qgc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikKLXsKK3N0YXRpYyBib29sIGNoZWNrX2Z0cl9zaGEoY29uc3Qgc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgewogICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNvcHk7CiAgICAgbWVtY3B5KCZjb3B5LCBjcnlwdF9mdHIsIHNpemVvZihjb3B5KSk7CiAgICAgc2V0X2Z0cl9zaGEoJmNvcHkpOwogICAgIHJldHVybiBtZW1jbXAoY29weS5zaGEyNTYsIGNyeXB0X2Z0ci0+c2hhMjU2LCBzaXplb2YoY29weS5zaGEyNTYpKSA9PSAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB1bml4X3JlYWQoaW50ICBmZCwgdm9pZCogIGJ1ZmYsIGludCAgbGVuKQoteworc3RhdGljIGlubGluZSBpbnQgdW5peF9yZWFkKGludCBmZCwgdm9pZCogYnVmZiwgaW50IGxlbikgewogICAgIHJldHVybiBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChmZCwgYnVmZiwgbGVuKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVuaXhfd3JpdGUoaW50ICBmZCwgY29uc3Qgdm9pZCogIGJ1ZmYsIGludCAgbGVuKQoteworc3RhdGljIGlubGluZSBpbnQgdW5peF93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQqIGJ1ZmYsIGludCBsZW4pIHsKICAgICByZXR1cm4gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLCBidWZmLCBsZW4pKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9lbXB0eV9wZXJzaXN0X2RhdGEoc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGEsIGludCBsZW4pCi17CitzdGF0aWMgdm9pZCBpbml0X2VtcHR5X3BlcnNpc3RfZGF0YShzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhKiBwZGF0YSwgaW50IGxlbikgewogICAgIG1lbXNldChwZGF0YSwgMCwgbGVuKTsKICAgICBwZGF0YS0+cGVyc2lzdF9tYWdpYyA9IFBFUlNJU1RfREFUQV9NQUdJQzsKICAgICBwZGF0YS0+cGVyc2lzdF92YWxpZF9lbnRyaWVzID0gMDsKQEAgLTU4OCwxOCArNTY2LDE3IEBACiAgKiBkYXRhLCBjcnlwdF9mdHIgaXMgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgdG8gYmUgdXBkYXRlZCwgYW5kIG9mZnNldCBpcyB0aGUKICAqIGFic29sdXRlIG9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGNyeXB0X21udF9mdHIgb24gdGhlIHBhc3NlZCBpbiBmZC4KICAqLwotc3RhdGljIHZvaWQgdXBncmFkZV9jcnlwdF9mdHIoaW50IGZkLCBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyLCBvZmY2NF90IG9mZnNldCkKLXsKK3N0YXRpYyB2b2lkIHVwZ3JhZGVfY3J5cHRfZnRyKGludCBmZCwgc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0ciwgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBpbnQgb3JpZ19tYWpvciA9IGNyeXB0X2Z0ci0+bWFqb3JfdmVyc2lvbjsKICAgICBpbnQgb3JpZ19taW5vciA9IGNyeXB0X2Z0ci0+bWlub3JfdmVyc2lvbjsKIAogICAgIGlmICgoY3J5cHRfZnRyLT5tYWpvcl92ZXJzaW9uID09IDEpICYmIChjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24gPT0gMCkpIHsKLSAgICAgICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGE7CisgICAgICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEqIHBkYXRhOwogICAgICAgICBvZmY2NF90IHBkYXRhX29mZnNldCA9IG9mZnNldCArIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVDsKIAogICAgICAgICBTTE9HVygidXBncmFkaW5nIGNyeXB0byBmb290ZXIgdG8gMS4xIik7CiAKLSAgICAgICAgcGRhdGEgPSAoY3J5cHRfcGVyc2lzdF9kYXRhICopbWFsbG9jKENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKKyAgICAgICAgcGRhdGEgPSAoY3J5cHRfcGVyc2lzdF9kYXRhKiltYWxsb2MoQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOwogICAgICAgICBpZiAocGRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCBhbGxvY2F0ZSBwZXJzaXNlbnQgZGF0YVxuIik7CiAgICAgICAgICAgICByZXR1cm47CkBAIC02NTIsOTEgKzYyOSw4OSBAQAogICAgIH0KIH0KIAorc3RhdGljIGludCBnZXRfY3J5cHRfZnRyX2FuZF9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgeworICAgIGludCBmZDsKKyAgICB1bnNpZ25lZCBpbnQgY250OworICAgIG9mZjY0X3Qgc3RhcnRpbmdfb2ZmOworICAgIGludCByYyA9IC0xOworICAgIGNoYXIqIGZuYW1lID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogCi1zdGF0aWMgaW50IGdldF9jcnlwdF9mdHJfYW5kX2tleShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyKQotewotICBpbnQgZmQ7Ci0gIHVuc2lnbmVkIGludCBjbnQ7Ci0gIG9mZjY0X3Qgc3RhcnRpbmdfb2ZmOwotICBpbnQgcmMgPSAtMTsKLSAgY2hhciAqZm5hbWUgPSBOVUxMOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGlmIChnZXRfY3J5cHRfZnRyX2luZm8oJmZuYW1lLCAmc3RhcnRpbmdfb2ZmKSkgeworICAgICAgICBTTE9HRSgiVW5hYmxlIHRvIGdldCBjcnlwdF9mdHJfaW5mb1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGZuYW1lWzBdICE9ICcvJykgeworICAgICAgICBTTE9HRSgiVW5leHBlY3RlZCB2YWx1ZSBmb3IgY3J5cHRvIGtleSBsb2NhdGlvblxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUiB8IE9fQ0xPRVhFQykpIDwgMCkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IG9wZW4gZm9vdGVyIGZpbGUgJXMgZm9yIGdldFxuIiwgZm5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0gIGlmIChnZXRfY3J5cHRfZnRyX2luZm8oJmZuYW1lLCAmc3RhcnRpbmdfb2ZmKSkgewotICAgIFNMT0dFKCJVbmFibGUgdG8gZ2V0IGNyeXB0X2Z0cl9pbmZvXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGZuYW1lWzBdICE9ICcvJykgewotICAgIFNMT0dFKCJVbmV4cGVjdGVkIHZhbHVlIGZvciBjcnlwdG8ga2V5IGxvY2F0aW9uXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKCAoZmQgPSBvcGVuKGZuYW1lLCBPX1JEV1J8T19DTE9FWEVDKSkgPCAwKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCBvcGVuIGZvb3RlciBmaWxlICVzIGZvciBnZXRcbiIsIGZuYW1lKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KKyAgICAvKiBNYWtlIHN1cmUgaXQncyAxNiBLYnl0ZXMgaW4gbGVuZ3RoICovCisgICAgZnN0YXQoZmQsICZzdGF0YnVmKTsKKyAgICBpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpICYmIChzdGF0YnVmLnN0X3NpemUgIT0gMHg0MDAwKSkgeworICAgICAgICBTTE9HRSgiZm9vdGVyIGZpbGUgJXMgaXMgbm90IHRoZSBleHBlY3RlZCBzaXplIVxuIiwgZm5hbWUpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgLyogTWFrZSBzdXJlIGl0J3MgMTYgS2J5dGVzIGluIGxlbmd0aCAqLwotICBmc3RhdChmZCwgJnN0YXRidWYpOwotICBpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpICYmIChzdGF0YnVmLnN0X3NpemUgIT0gMHg0MDAwKSkgewotICAgIFNMT0dFKCJmb290ZXIgZmlsZSAlcyBpcyBub3QgdGhlIGV4cGVjdGVkIHNpemUhXG4iLCBmbmFtZSk7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgY3J5cHQgZm9vdGVyICovCisgICAgaWYgKGxzZWVrNjQoZmQsIHN0YXJ0aW5nX29mZiwgU0VFS19TRVQpID09IC0xKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3Qgc2VlayB0byByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGNyeXB0IGZvb3RlciAqLwotICBpZiAobHNlZWs2NChmZCwgc3RhcnRpbmdfb2ZmLCBTRUVLX1NFVCkgPT0gLTEpIHsKLSAgICBTTE9HRSgiQ2Fubm90IHNlZWsgdG8gcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIGlmICgoY250ID0gcmVhZChmZCwgY3J5cHRfZnRyLCBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSkgIT0gc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IHJlYWQgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIGlmICggKGNudCA9IHJlYWQoZmQsIGNyeXB0X2Z0ciwgc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkpICE9IHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpIHsKLSAgICBTTE9HRSgiQ2Fubm90IHJlYWQgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIGlmIChjcnlwdF9mdHItPm1hZ2ljICE9IENSWVBUX01OVF9NQUdJQykgeworICAgICAgICBTTE9HRSgiQmFkIG1hZ2ljIGZvciByZWFsIGJsb2NrIGRldmljZSAlc1xuIiwgZm5hbWUpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgaWYgKGNyeXB0X2Z0ci0+bWFnaWMgIT0gQ1JZUFRfTU5UX01BR0lDKSB7Ci0gICAgU0xPR0UoIkJhZCBtYWdpYyBmb3IgcmVhbCBibG9jayBkZXZpY2UgJXNcbiIsIGZuYW1lKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIGlmIChjcnlwdF9mdHItPm1ham9yX3ZlcnNpb24gIT0gQ1VSUkVOVF9NQUpPUl9WRVJTSU9OKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3QgdW5kZXJzdGFuZCBtYWpvciB2ZXJzaW9uICVkIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlcjsgZXhwZWN0ZWQgJWRcbiIsCisgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+bWFqb3JfdmVyc2lvbiwgQ1VSUkVOVF9NQUpPUl9WRVJTSU9OKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIGlmIChjcnlwdF9mdHItPm1ham9yX3ZlcnNpb24gIT0gQ1VSUkVOVF9NQUpPUl9WRVJTSU9OKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCB1bmRlcnN0YW5kIG1ham9yIHZlcnNpb24gJWQgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyOyBleHBlY3RlZCAlZFxuIiwKLSAgICAgICAgICBjcnlwdF9mdHItPm1ham9yX3ZlcnNpb24sIENVUlJFTlRfTUFKT1JfVkVSU0lPTik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICAvLyBXZSByaXNrIGJ1ZmZlciBvdmVyZmxvd3Mgd2l0aCBvdmVyc2l6ZWQga2V5cywgc28gd2UganVzdCByZWplY3QgdGhlbS4KKyAgICAvLyAwLXNpemVkIGtleXMgYXJlIHByb2JsZW1hdGljIChlc3NlbnRpYWxseSBieS1wYXNzaW5nIGVuY3J5cHRpb24pLCBhbmQKKyAgICAvLyBBRVMtQ0JDIGtleSB3cmFwcGluZyBvbmx5IHdvcmtzIGZvciBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCisgICAgaWYgKChjcnlwdF9mdHItPmtleXNpemUgPT0gMCkgfHwgKChjcnlwdF9mdHItPmtleXNpemUgJSAxNikgIT0gMCkgfHwKKyAgICAgICAgKGNyeXB0X2Z0ci0+a2V5c2l6ZSA+IE1BWF9LRVlfTEVOKSkgeworICAgICAgICBTTE9HRSgKKyAgICAgICAgICAgICJJbnZhbGlkIGtleXNpemUgKCV1KSBmb3IgYmxvY2sgZGV2aWNlICVzOyBNdXN0IGJlIG5vbi16ZXJvLCAiCisgICAgICAgICAgICAiZGl2aXNpYmxlIGJ5IDE2LCBhbmQgPD0gJWRcbiIsCisgICAgICAgICAgICBjcnlwdF9mdHItPmtleXNpemUsIGZuYW1lLCBNQVhfS0VZX0xFTik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICAvLyBXZSByaXNrIGJ1ZmZlciBvdmVyZmxvd3Mgd2l0aCBvdmVyc2l6ZWQga2V5cywgc28gd2UganVzdCByZWplY3QgdGhlbS4KLSAgLy8gMC1zaXplZCBrZXlzIGFyZSBwcm9ibGVtYXRpYyAoZXNzZW50aWFsbHkgYnktcGFzc2luZyBlbmNyeXB0aW9uKSwgYW5kCi0gIC8vIEFFUy1DQkMga2V5IHdyYXBwaW5nIG9ubHkgd29ya3MgZm9yIG11bHRpcGxlcyBvZiAxNiBieXRlcy4KLSAgaWYgKChjcnlwdF9mdHItPmtleXNpemUgPT0gMCkgfHwgKChjcnlwdF9mdHItPmtleXNpemUgJSAxNikgIT0gMCkgfHwKLSAgICAgIChjcnlwdF9mdHItPmtleXNpemUgPiBNQVhfS0VZX0xFTikpIHsKLSAgICBTTE9HRSgiSW52YWxpZCBrZXlzaXplICgldSkgZm9yIGJsb2NrIGRldmljZSAlczsgTXVzdCBiZSBub24temVybywgIgotICAgICAgICAgICJkaXZpc2libGUgYnkgMTYsIGFuZCA8PSAlZFxuIiwgY3J5cHRfZnRyLT5rZXlzaXplLCBmbmFtZSwKLSAgICAgICAgICBNQVhfS0VZX0xFTik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICBpZiAoY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uID4gQ1VSUkVOVF9NSU5PUl9WRVJTSU9OKSB7CisgICAgICAgIFNMT0dXKCJXYXJuaW5nOiBjcnlwdG8gZm9vdGVyIG1pbm9yIHZlcnNpb24gJWQsIGV4cGVjdGVkIDw9ICVkLCBjb250aW51aW5nLi4uXG4iLAorICAgICAgICAgICAgICBjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24sIENVUlJFTlRfTUlOT1JfVkVSU0lPTik7CisgICAgfQogCi0gIGlmIChjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24gPiBDVVJSRU5UX01JTk9SX1ZFUlNJT04pIHsKLSAgICBTTE9HVygiV2FybmluZzogY3J5cHRvIGZvb3RlciBtaW5vciB2ZXJzaW9uICVkLCBleHBlY3RlZCA8PSAlZCwgY29udGludWluZy4uLlxuIiwKLSAgICAgICAgICBjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24sIENVUlJFTlRfTUlOT1JfVkVSU0lPTik7Ci0gIH0KKyAgICAvKiBJZiB0aGlzIGlzIGEgdmVyaW9uIDEuMCBjcnlwdF9mdHIsIG1ha2UgaXQgYSAxLjEgY3J5cHQgZm9vdGVyLCBhbmQgdXBkYXRlIHRoZQorICAgICAqIGNvcHkgb24gZGlzayBiZWZvcmUgcmV0dXJuaW5nLgorICAgICAqLworICAgIGlmIChjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24gPCBDVVJSRU5UX01JTk9SX1ZFUlNJT04pIHsKKyAgICAgICAgdXBncmFkZV9jcnlwdF9mdHIoZmQsIGNyeXB0X2Z0ciwgc3RhcnRpbmdfb2ZmKTsKKyAgICB9CiAKLSAgLyogSWYgdGhpcyBpcyBhIHZlcmlvbiAxLjAgY3J5cHRfZnRyLCBtYWtlIGl0IGEgMS4xIGNyeXB0IGZvb3RlciwgYW5kIHVwZGF0ZSB0aGUKLSAgICogY29weSBvbiBkaXNrIGJlZm9yZSByZXR1cm5pbmcuCi0gICAqLwotICBpZiAoY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uIDwgQ1VSUkVOVF9NSU5PUl9WRVJTSU9OKSB7Ci0gICAgdXBncmFkZV9jcnlwdF9mdHIoZmQsIGNyeXB0X2Z0ciwgc3RhcnRpbmdfb2ZmKTsKLSAgfQotCi0gIC8qIFN1Y2Nlc3MhICovCi0gIHJjID0gMDsKKyAgICAvKiBTdWNjZXNzISAqLworICAgIHJjID0gMDsKIAogZXJyb3V0OgotICBjbG9zZShmZCk7Ci0gIHJldHVybiByYzsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHZhbGlkYXRlX3BlcnNpc3RlbnRfZGF0YV9zdG9yYWdlKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIpCi17CitzdGF0aWMgaW50IHZhbGlkYXRlX3BlcnNpc3RlbnRfZGF0YV9zdG9yYWdlKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKICAgICBpZiAoY3J5cHRfZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdICsgY3J5cHRfZnRyLT5wZXJzaXN0X2RhdGFfc2l6ZSA+CiAgICAgICAgIGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX29mZnNldFsxXSkgewogICAgICAgICBTTE9HRSgiQ3J5cHRfZnRyIHBlcnNpc3QgZGF0YSByZWdpb25zIG92ZXJsYXAiKTsKQEAgLTc0OSw3ICs3MjQsNyBAQAogICAgIH0KIAogICAgIGlmICgoKGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX29mZnNldFsxXSArIGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX3NpemUpIC0KLSAgICAgICAgKGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX29mZnNldFswXSAtIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVCkpID4KKyAgICAgICAgIChjcnlwdF9mdHItPnBlcnNpc3RfZGF0YV9vZmZzZXRbMF0gLSBDUllQVF9GT09URVJfVE9fUEVSU0lTVF9PRkZTRVQpKSA+CiAgICAgICAgIENSWVBUX0ZPT1RFUl9PRkZTRVQpIHsKICAgICAgICAgU0xPR0UoIlBlcnNpc3RlbnQgZGF0YSBleHRlbmRzIHBhc3QgY3J5cHRvIGZvb3RlciIpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC03NTgsMTIgKzczMywxMSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxvYWRfcGVyc2lzdGVudF9kYXRhKHZvaWQpCi17CitzdGF0aWMgaW50IGxvYWRfcGVyc2lzdGVudF9kYXRhKHZvaWQpIHsKICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjcnlwdF9mdHI7Ci0gICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGEgPSBOVUxMOworICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEqIHBkYXRhID0gTlVMTDsKICAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGNoYXIgKmZuYW1lOworICAgIGNoYXIqIGZuYW1lOwogICAgIGludCBmb3VuZCA9IDA7CiAgICAgaW50IGZkOwogICAgIGludCByZXQ7CkBAIC03NzQsMTAgKzc0OCw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotCiAgICAgLyogSWYgbm90IGVuY3J5cHRlZCwganVzdCBhbGxvY2F0ZSBhbiBlbXB0eSB0YWJsZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSApIHsKKyAgICBpZiAoc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CiAgICAgICAgIHBkYXRhID0gKGNyeXB0X3BlcnNpc3RfZGF0YSopbWFsbG9jKENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKICAgICAgICAgaWYgKHBkYXRhKSB7CiAgICAgICAgICAgICBpbml0X2VtcHR5X3BlcnNpc3RfZGF0YShwZGF0YSwgQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOwpAQCAtNzg3LDEyICs3NjAsMTIgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmKGdldF9jcnlwdF9mdHJfYW5kX2tleSgmY3J5cHRfZnRyKSkgeworICAgIGlmIChnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmICgoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPCAxKQotICAgICAgICB8fCAoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPT0gMSAmJiBjcnlwdF9mdHIubWlub3JfdmVyc2lvbiA8IDEpKSB7CisgICAgaWYgKChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA8IDEpIHx8CisgICAgICAgIChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA9PSAxICYmIGNyeXB0X2Z0ci5taW5vcl92ZXJzaW9uIDwgMSkpIHsKICAgICAgICAgU0xPR0UoIkNyeXB0X2Z0ciB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBwZXJzaXN0ZW50IGRhdGEiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTgwNiw3ICs3NzksNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWXxPX0NMT0VYRUMpOworICAgIGZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuICVzIG1ldGFkYXRhIGZpbGUiLCBmbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTgyMyw3ICs3OTYsNyBAQAogICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCBzZWVrIHRvIHJlYWQgcGVyc2lzdGVudCBkYXRhIG9uICVzIiwgZm5hbWUpOwogICAgICAgICAgICAgZ290byBlcnIyOwogICAgICAgICB9Ci0gICAgICAgIGlmICh1bml4X3JlYWQoZmQsIHBkYXRhLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpIDwgMCl7CisgICAgICAgIGlmICh1bml4X3JlYWQoZmQsIHBkYXRhLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpIDwgMCkgewogICAgICAgICAgICAgU0xPR0UoIkVycm9yIHJlYWRpbmcgcGVyc2lzdGVudCBkYXRhIG9uIGl0ZXJhdGlvbiAlZCIsIGkpOwogICAgICAgICAgICAgZ290byBlcnIyOwogICAgICAgICB9CkBAIC04NTEsMTEgKzgyNCwxMCBAQAogICAgIHJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBzYXZlX3BlcnNpc3RlbnRfZGF0YSh2b2lkKQoteworc3RhdGljIGludCBzYXZlX3BlcnNpc3RlbnRfZGF0YSh2b2lkKSB7CiAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgY3J5cHRfZnRyOwotICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEgKnBkYXRhOwotICAgIGNoYXIgKmZuYW1lOworICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEqIHBkYXRhOworICAgIGNoYXIqIGZuYW1lOwogICAgIG9mZjY0X3Qgd3JpdGVfb2Zmc2V0OwogICAgIG9mZjY0X3QgZXJhc2Vfb2Zmc2V0OwogICAgIGludCBmZDsKQEAgLTg2NiwxMiArODM4LDEyIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZihnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKKyAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uIDwgMSkKLSAgICAgICAgfHwgKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uID09IDEgJiYgY3J5cHRfZnRyLm1pbm9yX3ZlcnNpb24gPCAxKSkgeworICAgIGlmICgoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPCAxKSB8fAorICAgICAgICAoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPT0gMSAmJiBjcnlwdF9mdHIubWlub3JfdmVyc2lvbiA8IDEpKSB7CiAgICAgICAgIFNMT0dFKCJDcnlwdF9mdHIgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgcGVyc2lzdGVudCBkYXRhIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC04ODUsNyArODU3LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGZkID0gb3BlbihmbmFtZSwgT19SRFdSfE9fQ0xPRVhFQyk7CisgICAgZmQgPSBvcGVuKGZuYW1lLCBPX1JEV1IgfCBPX0NMT0VYRUMpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuICVzIG1ldGFkYXRhIGZpbGUiLCBmbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTkwMywyMCArODc1LDIwIEBACiAgICAgfQogCiAgICAgaWYgKHVuaXhfcmVhZChmZCwgcGRhdGEsIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICBTTE9HRSgiRXJyb3IgcmVhZGluZyBwZXJzaXN0ZW50IGRhdGEgYmVmb3JlIHNhdmUiKTsKLSAgICAgICAgICAgIGdvdG8gZXJyMjsKKyAgICAgICAgU0xPR0UoIkVycm9yIHJlYWRpbmcgcGVyc2lzdGVudCBkYXRhIGJlZm9yZSBzYXZlIik7CisgICAgICAgIGdvdG8gZXJyMjsKICAgICB9CiAKICAgICBpZiAocGRhdGEtPnBlcnNpc3RfbWFnaWMgPT0gUEVSU0lTVF9EQVRBX01BR0lDKSB7CiAgICAgICAgIC8qIFRoZSBmaXJzdCBjb3B5IGlzIHRoZSBjdXJlbnQgdmFsaWQgY29weSwgc28gd3JpdGUgdG8KICAgICAgICAgICogdGhlIHNlY29uZCBjb3B5IGFuZCBlcmFzZSB0aGlzIG9uZSAqLwotICAgICAgIHdyaXRlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdOwotICAgICAgIGVyYXNlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdOworICAgICAgICB3cml0ZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFsxXTsKKyAgICAgICAgZXJhc2Vfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMF07CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogVGhlIHNlY29uZCBjb3B5IG11c3QgYmUgdGhlIHZhbGlkIGNvcHksIHNvIHdyaXRlIHRvCiAgICAgICAgICAqIHRoZSBmaXJzdCBjb3B5LCBhbmQgZXJhc2UgdGhlIHNlY29uZCAqLwotICAgICAgIHdyaXRlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdOwotICAgICAgIGVyYXNlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdOworICAgICAgICB3cml0ZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFswXTsKKyAgICAgICAgZXJhc2Vfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMV07CiAgICAgfQogCiAgICAgLyogV3JpdGUgdGhlIG5ldyBjb3B5IGZpcnN0LCBpZiBzdWNjZXNzZnVsLCB0aGVuIGVyYXNlIHRoZSBvbGQgY29weSAqLwpAQCAtOTI1LDE1ICs4OTcsMTQgQEAKICAgICAgICAgZ290byBlcnIyOwogICAgIH0KICAgICBpZiAodW5peF93cml0ZShmZCwgcGVyc2lzdF9kYXRhLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpID09Ci0gICAgICAgIChpbnQpIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgeworICAgICAgICAoaW50KWNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgewogICAgICAgICBpZiAobHNlZWs2NChmZCwgZXJhc2Vfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKSB7CiAgICAgICAgICAgICBTTE9HRSgiQ2Fubm90IHNlZWsgdG8gZXJhc2UgcHJldmlvdXMgcGVyc2lzdGVudCBkYXRhIik7CiAgICAgICAgICAgICBnb3RvIGVycjI7CiAgICAgICAgIH0KICAgICAgICAgZnN5bmMoZmQpOwogICAgICAgICBtZW1zZXQocGRhdGEsIDAsIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSk7Ci0gICAgICAgIGlmICh1bml4X3dyaXRlKGZkLCBwZGF0YSwgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSAhPQotICAgICAgICAgICAgKGludCkgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSB7CisgICAgICAgIGlmICh1bml4X3dyaXRlKGZkLCBwZGF0YSwgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSAhPSAoaW50KWNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgewogICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCB3cml0ZSB0byBlcmFzZSBwcmV2aW91cyBwZXJzaXN0ZW50IGRhdGEiKTsKICAgICAgICAgICAgIGdvdG8gZXJyMjsKICAgICAgICAgfQpAQCAtOTU4LDg1ICs5MjksODIgQEAKIC8qIENvbnZlcnQgYSBiaW5hcnkga2V5IG9mIHNwZWNpZmllZCBsZW5ndGggaW50byBhbiBhc2NpaSBoZXggc3RyaW5nIGVxdWl2YWxlbnQsCiAgKiB3aXRob3V0IHRoZSBsZWFkaW5nIDB4IGFuZCB3aXRoIG51bGwgdGVybWluYXRpb24KICAqLwotc3RhdGljIHZvaWQgY29udmVydF9rZXlfdG9faGV4X2FzY2lpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleXNpemUsIGNoYXIgKm1hc3Rlcl9rZXlfYXNjaWkpIHsKK3N0YXRpYyB2b2lkIGNvbnZlcnRfa2V5X3RvX2hleF9hc2NpaShjb25zdCB1bnNpZ25lZCBjaGFyKiBtYXN0ZXJfa2V5LCB1bnNpZ25lZCBpbnQga2V5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBtYXN0ZXJfa2V5X2FzY2lpKSB7CiAgICAgdW5zaWduZWQgaW50IGksIGE7CiAgICAgdW5zaWduZWQgY2hhciBuaWJibGU7CiAKLSAgICBmb3IgKGk9MCwgYT0wOyBpPGtleXNpemU7IGkrKywgYSs9MikgeworICAgIGZvciAoaSA9IDAsIGEgPSAwOyBpIDwga2V5c2l6ZTsgaSsrLCBhICs9IDIpIHsKICAgICAgICAgLyogRm9yIGVhY2ggYnl0ZSwgd3JpdGUgb3V0IHR3byBhc2NpaSBoZXggZGlnaXRzICovCiAgICAgICAgIG5pYmJsZSA9IChtYXN0ZXJfa2V5W2ldID4+IDQpICYgMHhmOwogICAgICAgICBtYXN0ZXJfa2V5X2FzY2lpW2FdID0gbmliYmxlICsgKG5pYmJsZSA+IDkgPyAweDM3IDogMHgzMCk7CiAKICAgICAgICAgbmliYmxlID0gbWFzdGVyX2tleVtpXSAmIDB4ZjsKLSAgICAgICAgbWFzdGVyX2tleV9hc2NpaVthKzFdID0gbmliYmxlICsgKG5pYmJsZSA+IDkgPyAweDM3IDogMHgzMCk7CisgICAgICAgIG1hc3Rlcl9rZXlfYXNjaWlbYSArIDFdID0gbmliYmxlICsgKG5pYmJsZSA+IDkgPyAweDM3IDogMHgzMCk7CiAgICAgfQogCiAgICAgLyogQWRkIHRoZSBudWxsIHRlcm1pbmF0aW9uICovCiAgICAgbWFzdGVyX2tleV9hc2NpaVthXSA9ICdcMCc7Ci0KIH0KIAotc3RhdGljIGludCBsb2FkX2NyeXB0b19tYXBwaW5nX3RhYmxlKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIsCi0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hc3Rlcl9rZXksIGNvbnN0IGNoYXIgKnJlYWxfYmxrX25hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmZCwgY29uc3QgY2hhciAqZXh0cmFfcGFyYW1zKSB7Ci0gIGFsaWduYXMoc3RydWN0IGRtX2lvY3RsKSBjaGFyIGJ1ZmZlcltETV9DUllQVF9CVUZfU0laRV07Ci0gIHN0cnVjdCBkbV9pb2N0bCAqaW87Ci0gIHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqdGd0OwotICBjaGFyICpjcnlwdF9wYXJhbXM7Ci0gIC8vIFdlIG5lZWQgdHdvIEFTQ0lJIGNoYXJhY3RlcnMgdG8gcmVwcmVzZW50IGVhY2ggYnl0ZSwgYW5kIG5lZWQgc3BhY2UgZm9yCi0gIC8vIHRoZSAnXDAnIHRlcm1pbmF0b3IuCi0gIGNoYXIgbWFzdGVyX2tleV9hc2NpaVtNQVhfS0VZX0xFTiAqIDIgKyAxXTsKLSAgc2l6ZV90IGJ1ZmZfb2Zmc2V0OwotICBpbnQgaTsKK3N0YXRpYyBpbnQgbG9hZF9jcnlwdG9fbWFwcGluZ190YWJsZShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIG1hc3Rlcl9rZXksIGNvbnN0IGNoYXIqIHJlYWxfYmxrX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgaW50IGZkLCBjb25zdCBjaGFyKiBleHRyYV9wYXJhbXMpIHsKKyAgICBhbGlnbmFzKHN0cnVjdCBkbV9pb2N0bCkgY2hhciBidWZmZXJbRE1fQ1JZUFRfQlVGX1NJWkVdOworICAgIHN0cnVjdCBkbV9pb2N0bCogaW87CisgICAgc3RydWN0IGRtX3RhcmdldF9zcGVjKiB0Z3Q7CisgICAgY2hhciogY3J5cHRfcGFyYW1zOworICAgIC8vIFdlIG5lZWQgdHdvIEFTQ0lJIGNoYXJhY3RlcnMgdG8gcmVwcmVzZW50IGVhY2ggYnl0ZSwgYW5kIG5lZWQgc3BhY2UgZm9yCisgICAgLy8gdGhlICdcMCcgdGVybWluYXRvci4KKyAgICBjaGFyIG1hc3Rlcl9rZXlfYXNjaWlbTUFYX0tFWV9MRU4gKiAyICsgMV07CisgICAgc2l6ZV90IGJ1ZmZfb2Zmc2V0OworICAgIGludCBpOwogCi0gIGlvID0gKHN0cnVjdCBkbV9pb2N0bCAqKSBidWZmZXI7CisgICAgaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CiAKLSAgLyogTG9hZCB0aGUgbWFwcGluZyB0YWJsZSBmb3IgdGhpcyBkZXZpY2UgKi8KLSAgdGd0ID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqKSAmYnVmZmVyW3NpemVvZihzdHJ1Y3QgZG1faW9jdGwpXTsKKyAgICAvKiBMb2FkIHRoZSBtYXBwaW5nIHRhYmxlIGZvciB0aGlzIGRldmljZSAqLworICAgIHRndCA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMqKSZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOwogCi0gIGlvY3RsX2luaXQoaW8sIERNX0NSWVBUX0JVRl9TSVpFLCBuYW1lLCAwKTsKLSAgaW8tPnRhcmdldF9jb3VudCA9IDE7Ci0gIHRndC0+c3RhdHVzID0gMDsKLSAgdGd0LT5zZWN0b3Jfc3RhcnQgPSAwOwotICB0Z3QtPmxlbmd0aCA9IGNyeXB0X2Z0ci0+ZnNfc2l6ZTsKLSAgc3RybGNweSh0Z3QtPnRhcmdldF90eXBlLCAiY3J5cHQiLCBETV9NQVhfVFlQRV9OQU1FKTsKKyAgICBpb2N0bF9pbml0KGlvLCBETV9DUllQVF9CVUZfU0laRSwgbmFtZSwgMCk7CisgICAgaW8tPnRhcmdldF9jb3VudCA9IDE7CisgICAgdGd0LT5zdGF0dXMgPSAwOworICAgIHRndC0+c2VjdG9yX3N0YXJ0ID0gMDsKKyAgICB0Z3QtPmxlbmd0aCA9IGNyeXB0X2Z0ci0+ZnNfc2l6ZTsKKyAgICBzdHJsY3B5KHRndC0+dGFyZ2V0X3R5cGUsICJjcnlwdCIsIERNX01BWF9UWVBFX05BTUUpOwogCi0gIGNyeXB0X3BhcmFtcyA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYyk7Ci0gIGNvbnZlcnRfa2V5X3RvX2hleF9hc2NpaShtYXN0ZXJfa2V5LCBjcnlwdF9mdHItPmtleXNpemUsIG1hc3Rlcl9rZXlfYXNjaWkpOworICAgIGNyeXB0X3BhcmFtcyA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYyk7CisgICAgY29udmVydF9rZXlfdG9faGV4X2FzY2lpKG1hc3Rlcl9rZXksIGNyeXB0X2Z0ci0+a2V5c2l6ZSwgbWFzdGVyX2tleV9hc2NpaSk7CiAKLSAgYnVmZl9vZmZzZXQgPSBjcnlwdF9wYXJhbXMgLSBidWZmZXI7Ci0gIFNMT0dJKCJFeHRyYSBwYXJhbWV0ZXJzIGZvciBkbV9jcnlwdDogJXNcbiIsIGV4dHJhX3BhcmFtcyk7Ci0gIHNucHJpbnRmKGNyeXB0X3BhcmFtcywgc2l6ZW9mKGJ1ZmZlcikgLSBidWZmX29mZnNldCwgIiVzICVzIDAgJXMgMCAlcyIsCi0gICAgICAgICAgIGNyeXB0X2Z0ci0+Y3J5cHRvX3R5cGVfbmFtZSwgbWFzdGVyX2tleV9hc2NpaSwgcmVhbF9ibGtfbmFtZSwKLSAgICAgICAgICAgZXh0cmFfcGFyYW1zKTsKLSAgY3J5cHRfcGFyYW1zICs9IHN0cmxlbihjcnlwdF9wYXJhbXMpICsgMTsKLSAgY3J5cHRfcGFyYW1zID0gKGNoYXIgKikgKCgodW5zaWduZWQgbG9uZyljcnlwdF9wYXJhbXMgKyA3KSAmIH44KTsgLyogQWxpZ24gdG8gYW4gOCBieXRlIGJvdW5kYXJ5ICovCi0gIHRndC0+bmV4dCA9IGNyeXB0X3BhcmFtcyAtIGJ1ZmZlcjsKKyAgICBidWZmX29mZnNldCA9IGNyeXB0X3BhcmFtcyAtIGJ1ZmZlcjsKKyAgICBTTE9HSSgiRXh0cmEgcGFyYW1ldGVycyBmb3IgZG1fY3J5cHQ6ICVzXG4iLCBleHRyYV9wYXJhbXMpOworICAgIHNucHJpbnRmKGNyeXB0X3BhcmFtcywgc2l6ZW9mKGJ1ZmZlcikgLSBidWZmX29mZnNldCwgIiVzICVzIDAgJXMgMCAlcyIsCisgICAgICAgICAgICAgY3J5cHRfZnRyLT5jcnlwdG9fdHlwZV9uYW1lLCBtYXN0ZXJfa2V5X2FzY2lpLCByZWFsX2Jsa19uYW1lLCBleHRyYV9wYXJhbXMpOworICAgIGNyeXB0X3BhcmFtcyArPSBzdHJsZW4oY3J5cHRfcGFyYW1zKSArIDE7CisgICAgY3J5cHRfcGFyYW1zID0KKyAgICAgICAgKGNoYXIqKSgoKHVuc2lnbmVkIGxvbmcpY3J5cHRfcGFyYW1zICsgNykgJiB+OCk7IC8qIEFsaWduIHRvIGFuIDggYnl0ZSBib3VuZGFyeSAqLworICAgIHRndC0+bmV4dCA9IGNyeXB0X3BhcmFtcyAtIGJ1ZmZlcjsKIAotICBmb3IgKGkgPSAwOyBpIDwgVEFCTEVfTE9BRF9SRVRSSUVTOyBpKyspIHsKLSAgICBpZiAoISBpb2N0bChmZCwgRE1fVEFCTEVfTE9BRCwgaW8pKSB7Ci0gICAgICBicmVhazsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVEFCTEVfTE9BRF9SRVRSSUVTOyBpKyspIHsKKyAgICAgICAgaWYgKCFpb2N0bChmZCwgRE1fVEFCTEVfTE9BRCwgaW8pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoNTAwMDAwKTsKICAgICB9Ci0gICAgdXNsZWVwKDUwMDAwMCk7Ci0gIH0KIAotICBpZiAoaSA9PSBUQUJMRV9MT0FEX1JFVFJJRVMpIHsKLSAgICAvKiBXZSBmYWlsZWQgdG8gbG9hZCB0aGUgdGFibGUsIHJldHVybiBhbiBlcnJvciAqLwotICAgIHJldHVybiAtMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gaSArIDE7Ci0gIH0KKyAgICBpZiAoaSA9PSBUQUJMRV9MT0FEX1JFVFJJRVMpIHsKKyAgICAgICAgLyogV2UgZmFpbGVkIHRvIGxvYWQgdGhlIHRhYmxlLCByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBpICsgMTsKKyAgICB9CiB9CiAKLQotc3RhdGljIGludCBnZXRfZG1fY3J5cHRfdmVyc2lvbihpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUsICBpbnQgKnZlcnNpb24pCi17CitzdGF0aWMgaW50IGdldF9kbV9jcnlwdF92ZXJzaW9uKGludCBmZCwgY29uc3QgY2hhciogbmFtZSwgaW50KiB2ZXJzaW9uKSB7CiAgICAgY2hhciBidWZmZXJbRE1fQ1JZUFRfQlVGX1NJWkVdOwotICAgIHN0cnVjdCBkbV9pb2N0bCAqaW87Ci0gICAgc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyAqdjsKKyAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvOworICAgIHN0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMqIHY7CiAKLSAgICBpbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOworICAgIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopYnVmZmVyOwogCiAgICAgaW9jdGxfaW5pdChpbywgRE1fQ1JZUFRfQlVGX1NJWkUsIG5hbWUsIDApOwogCkBAIC0xMDQ3LDE2ICsxMDE1LDE2IEBACiAgICAgLyogSXRlcmF0ZSBvdmVyIHRoZSByZXR1cm5lZCB2ZXJzaW9ucywgbG9va2luZyBmb3IgbmFtZSBvZiAiY3J5cHQiLgogICAgICAqIFdoZW4gZm91bmQsIGdldCBhbmQgcmV0dXJuIHRoZSB2ZXJzaW9uLgogICAgICAqLwotICAgIHYgPSAoc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyAqKSAmYnVmZmVyW3NpemVvZihzdHJ1Y3QgZG1faW9jdGwpXTsKKyAgICB2ID0gKHN0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMqKSZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOwogICAgIHdoaWxlICh2LT5uZXh0KSB7Ci0gICAgICAgIGlmICghIHN0cmNtcCh2LT5uYW1lLCAiY3J5cHQiKSkgeworICAgICAgICBpZiAoIXN0cmNtcCh2LT5uYW1lLCAiY3J5cHQiKSkgewogICAgICAgICAgICAgLyogV2UgZm91bmQgdGhlIGNyeXB0IGRyaXZlciwgcmV0dXJuIHRoZSB2ZXJzaW9uLCBhbmQgZ2V0IG91dCAqLwogICAgICAgICAgICAgdmVyc2lvblswXSA9IHYtPnZlcnNpb25bMF07CiAgICAgICAgICAgICB2ZXJzaW9uWzFdID0gdi0+dmVyc2lvblsxXTsKICAgICAgICAgICAgIHZlcnNpb25bMl0gPSB2LT52ZXJzaW9uWzJdOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgdiA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3ZlcnNpb25zICopKCgoY2hhciAqKXYpICsgdi0+bmV4dCk7CisgICAgICAgIHYgPSAoc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyopKCgoY2hhciopdikgKyB2LT5uZXh0KTsKICAgICB9CiAKICAgICByZXR1cm4gLTE7CkBAIC0xMTM0LDkxICsxMTAyLDg4IEBACiAgICAgICAgIGdvdG8gZXJyb3V0OwogICAgIH0KIAorICAgIC8qIEVuc3VyZSB0aGUgZG0gZGV2aWNlIGhhcyBiZWVuIGNyZWF0ZWQgYmVmb3JlIHJldHVybmluZy4gKi8KKyAgICBpZiAoYW5kcm9pZDo6dm9sZDo6V2FpdEZvckZpbGUoY3J5cHRvX2Jsa19uYW1lLCAxcykgPCAwKSB7CisgICAgICAgIC8vIFdhaXRGb3JGaWxlIGdlbmVyYXRlcyBhIHN1aXRhYmxlIGxvZyBtZXNzYWdlCisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KKwogICAgIC8qIFdlIG1hZGUgaXQgaGVyZSB3aXRoIG5vIGVycm9ycy4gIFdvb3QhICovCiAgICAgcmV0dmFsID0gMDsKIAogZXJyb3V0OgotICBjbG9zZShmZCk7ICAgLyogSWYgZmQgaXMgPDAgZnJvbSBhIGZhaWxlZCBvcGVuIGNhbGwsIGl0J3Mgc2FmZSB0byBqdXN0IGlnbm9yZSB0aGUgY2xvc2UgZXJyb3IgKi8KKyAgICBjbG9zZShmZCk7IC8qIElmIGZkIGlzIDwwIGZyb20gYSBmYWlsZWQgb3BlbiBjYWxsLCBpdCdzIHNhZmUgdG8ganVzdCBpZ25vcmUgdGhlIGNsb3NlIGVycm9yICovCiAKLSAgcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGRlbGV0ZV9jcnlwdG9fYmxrX2Rldihjb25zdCBjaGFyICpuYW1lKQotewotICBpbnQgZmQ7Ci0gIGNoYXIgYnVmZmVyW0RNX0NSWVBUX0JVRl9TSVpFXTsKLSAgc3RydWN0IGRtX2lvY3RsICppbzsKLSAgaW50IHJldHZhbCA9IC0xOworc3RhdGljIGludCBkZWxldGVfY3J5cHRvX2Jsa19kZXYoY29uc3QgY2hhciogbmFtZSkgeworICAgIGludCBmZDsKKyAgICBjaGFyIGJ1ZmZlcltETV9DUllQVF9CVUZfU0laRV07CisgICAgc3RydWN0IGRtX2lvY3RsKiBpbzsKKyAgICBpbnQgcmV0dmFsID0gLTE7CiAKLSAgaWYgKChmZCA9IG9wZW4oIi9kZXYvZGV2aWNlLW1hcHBlciIsIE9fUkRXUnxPX0NMT0VYRUMpKSA8IDAgKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCBvcGVuIGRldmljZS1tYXBwZXJcbiIpOwotICAgIGdvdG8gZXJyb3V0OwotICB9CisgICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvZGV2aWNlLW1hcHBlciIsIE9fUkRXUiB8IE9fQ0xPRVhFQykpIDwgMCkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IG9wZW4gZGV2aWNlLW1hcHBlclxuIik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICBpbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOworICAgIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopYnVmZmVyOwogCi0gIGlvY3RsX2luaXQoaW8sIERNX0NSWVBUX0JVRl9TSVpFLCBuYW1lLCAwKTsKLSAgaWYgKGlvY3RsKGZkLCBETV9ERVZfUkVNT1ZFLCBpbykpIHsKLSAgICBTTE9HRSgiQ2Fubm90IHJlbW92ZSBkbS1jcnlwdCBkZXZpY2VcbiIpOwotICAgIGdvdG8gZXJyb3V0OwotICB9CisgICAgaW9jdGxfaW5pdChpbywgRE1fQ1JZUFRfQlVGX1NJWkUsIG5hbWUsIDApOworICAgIGlmIChpb2N0bChmZCwgRE1fREVWX1JFTU9WRSwgaW8pKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3QgcmVtb3ZlIGRtLWNyeXB0IGRldmljZVxuIik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICAvKiBXZSBtYWRlIGl0IGhlcmUgd2l0aCBubyBlcnJvcnMuICBXb290ISAqLwotICByZXR2YWwgPSAwOworICAgIC8qIFdlIG1hZGUgaXQgaGVyZSB3aXRoIG5vIGVycm9ycy4gIFdvb3QhICovCisgICAgcmV0dmFsID0gMDsKIAogZXJyb3V0OgotICBjbG9zZShmZCk7ICAgIC8qIElmIGZkIGlzIDwwIGZyb20gYSBmYWlsZWQgb3BlbiBjYWxsLCBpdCdzIHNhZmUgdG8ganVzdCBpZ25vcmUgdGhlIGNsb3NlIGVycm9yICovCisgICAgY2xvc2UoZmQpOyAvKiBJZiBmZCBpcyA8MCBmcm9tIGEgZmFpbGVkIG9wZW4gY2FsbCwgaXQncyBzYWZlIHRvIGp1c3QgaWdub3JlIHRoZSBjbG9zZSBlcnJvciAqLwogCi0gIHJldHVybiByZXR2YWw7Ci0KKyAgICByZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IHBia2RmMihjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppa2V5LCB2b2lkICpwYXJhbXMgVU5VU0VEKQoteworc3RhdGljIGludCBwYmtkZjIoY29uc3QgY2hhciogcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzYWx0LCB1bnNpZ25lZCBjaGFyKiBpa2V5LAorICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW1zIFVOVVNFRCkgewogICAgIFNMT0dJKCJVc2luZyBwYmtkZjIgZm9yIGNyeXB0ZnMgS0RGIik7CiAKICAgICAvKiBUdXJuIHRoZSBwYXNzd29yZCBpbnRvIGEga2V5IGFuZCBJViB0aGF0IGNhbiBkZWNyeXB0IHRoZSBtYXN0ZXIga2V5ICovCi0gICAgcmV0dXJuIFBLQ1M1X1BCS0RGMl9ITUFDX1NIQTEocGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwgc2FsdCwgU0FMVF9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTSF9DT1VOVCwgSU5URVJNRURJQVRFX0JVRl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlrZXkpICE9IDE7CisgICAgcmV0dXJuIFBLQ1M1X1BCS0RGMl9ITUFDX1NIQTEocGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwgc2FsdCwgU0FMVF9MRU4sIEhBU0hfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJNRURJQVRFX0JVRl9TSVpFLCBpa2V5KSAhPSAxOwogfQogCi1zdGF0aWMgaW50IHNjcnlwdChjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppa2V5LCB2b2lkICpwYXJhbXMpCi17CitzdGF0aWMgaW50IHNjcnlwdChjb25zdCBjaGFyKiBwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNhbHQsIHVuc2lnbmVkIGNoYXIqIGlrZXksIHZvaWQqIHBhcmFtcykgewogICAgIFNMT0dJKCJVc2luZyBzY3J5cHQgZm9yIGNyeXB0ZnMgS0RGIik7CiAKLSAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyID0gKHN0cnVjdCBjcnlwdF9tbnRfZnRyICopIHBhcmFtczsKKyAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyID0gKHN0cnVjdCBjcnlwdF9tbnRfZnRyKilwYXJhbXM7CiAKICAgICBpbnQgTiA9IDEgPDwgZnRyLT5OX2ZhY3RvcjsKICAgICBpbnQgciA9IDEgPDwgZnRyLT5yX2ZhY3RvcjsKICAgICBpbnQgcCA9IDEgPDwgZnRyLT5wX2ZhY3RvcjsKIAogICAgIC8qIFR1cm4gdGhlIHBhc3N3b3JkIGludG8gYSBrZXkgYW5kIElWIHRoYXQgY2FuIGRlY3J5cHQgdGhlIG1hc3RlciBrZXkgKi8KLSAgICBjcnlwdG9fc2NyeXB0KChjb25zdCB1aW50OF90KilwYXNzd2QsIHN0cmxlbihwYXNzd2QpLAotICAgICAgICAgICAgICAgICAgc2FsdCwgU0FMVF9MRU4sIE4sIHIsIHAsIGlrZXksCisgICAgY3J5cHRvX3NjcnlwdCgoY29uc3QgdWludDhfdCopcGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwgc2FsdCwgU0FMVF9MRU4sIE4sIHIsIHAsIGlrZXksCiAgICAgICAgICAgICAgICAgICBJTlRFUk1FRElBVEVfQlVGX1NJWkUpOwogCi0gICByZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzY3J5cHRfa2V5bWFzdGVyKGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppa2V5LCB2b2lkICpwYXJhbXMpCi17CitzdGF0aWMgaW50IHNjcnlwdF9rZXltYXN0ZXIoY29uc3QgY2hhciogcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzYWx0LCB1bnNpZ25lZCBjaGFyKiBpa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtcykgewogICAgIFNMT0dJKCJVc2luZyBzY3J5cHQgd2l0aCBrZXltYXN0ZXIgZm9yIGNyeXB0ZnMgS0RGIik7CiAKICAgICBpbnQgcmM7CiAgICAgc2l6ZV90IHNpZ25hdHVyZV9zaXplOwogICAgIHVuc2lnbmVkIGNoYXIqIHNpZ25hdHVyZTsKLSAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyID0gKHN0cnVjdCBjcnlwdF9tbnRfZnRyICopIHBhcmFtczsKKyAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyID0gKHN0cnVjdCBjcnlwdF9tbnRfZnRyKilwYXJhbXM7CiAKICAgICBpbnQgTiA9IDEgPDwgZnRyLT5OX2ZhY3RvcjsKICAgICBpbnQgciA9IDEgPDwgZnRyLT5yX2ZhY3RvcjsKICAgICBpbnQgcCA9IDEgPDwgZnRyLT5wX2ZhY3RvcjsKIAotICAgIHJjID0gY3J5cHRvX3NjcnlwdCgoY29uc3QgdWludDhfdCopcGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgU0FMVF9MRU4sIE4sIHIsIHAsIGlrZXksCisgICAgcmMgPSBjcnlwdG9fc2NyeXB0KChjb25zdCB1aW50OF90KilwYXNzd2QsIHN0cmxlbihwYXNzd2QpLCBzYWx0LCBTQUxUX0xFTiwgTiwgciwgcCwgaWtleSwKICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJNRURJQVRFX0JVRl9TSVpFKTsKIAogICAgIGlmIChyYykgewpAQCAtMTIyNiwxNCArMTE5MSwxMyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKGtleW1hc3Rlcl9zaWduX29iamVjdChmdHIsIGlrZXksIElOVEVSTUVESUFURV9CVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmUsICZzaWduYXR1cmVfc2l6ZSkpIHsKKyAgICBpZiAoa2V5bWFzdGVyX3NpZ25fb2JqZWN0KGZ0ciwgaWtleSwgSU5URVJNRURJQVRFX0JVRl9TSVpFLCAmc2lnbmF0dXJlLCAmc2lnbmF0dXJlX3NpemUpKSB7CiAgICAgICAgIFNMT0dFKCJTaWduaW5nIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmMgPSBjcnlwdG9fc2NyeXB0KHNpZ25hdHVyZSwgc2lnbmF0dXJlX3NpemUsIHNhbHQsIFNBTFRfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICBOLCByLCBwLCBpa2V5LCBJTlRFUk1FRElBVEVfQlVGX1NJWkUpOworICAgIHJjID0gY3J5cHRvX3NjcnlwdChzaWduYXR1cmUsIHNpZ25hdHVyZV9zaXplLCBzYWx0LCBTQUxUX0xFTiwgTiwgciwgcCwgaWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5URVJNRURJQVRFX0JVRl9TSVpFKTsKICAgICBmcmVlKHNpZ25hdHVyZSk7CiAKICAgICBpZiAocmMpIHsKQEAgLTEyNDQsMTIgKzEyMDgsMTAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlbmNyeXB0X21hc3Rlcl9rZXkoY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGVjcnlwdGVkX21hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIpCi17Ci0gICAgdW5zaWduZWQgY2hhciBpa2V5W0lOVEVSTUVESUFURV9CVUZfU0laRV0gPSB7IDAgfTsKK3N0YXRpYyBpbnQgZW5jcnlwdF9tYXN0ZXJfa2V5KGNvbnN0IGNoYXIqIHBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciogc2FsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZW5jcnlwdGVkX21hc3Rlcl9rZXksIHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGlrZXlbSU5URVJNRURJQVRFX0JVRl9TSVpFXSA9IHswfTsKICAgICBFVlBfQ0lQSEVSX0NUWCBlX2N0eDsKICAgICBpbnQgZW5jcnlwdGVkX2xlbiwgZmluYWxfbGVuOwogICAgIGludCByYyA9IDA7CkBAIC0xMjU4LDQ2ICsxMjIwLDQ2IEBACiAgICAgZ2V0X2RldmljZV9zY3J5cHRfcGFyYW1zKGNyeXB0X2Z0cik7CiAKICAgICBzd2l0Y2ggKGNyeXB0X2Z0ci0+a2RmX3R5cGUpIHsKLSAgICBjYXNlIEtERl9TQ1JZUFRfS0VZTUFTVEVSOgotICAgICAgICBpZiAoa2V5bWFzdGVyX2NyZWF0ZV9rZXkoY3J5cHRfZnRyKSkgewotICAgICAgICAgICAgU0xPR0UoImtleW1hc3Rlcl9jcmVhdGVfa2V5IGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CisgICAgICAgIGNhc2UgS0RGX1NDUllQVF9LRVlNQVNURVI6CisgICAgICAgICAgICBpZiAoa2V5bWFzdGVyX2NyZWF0ZV9rZXkoY3J5cHRfZnRyKSkgeworICAgICAgICAgICAgICAgIFNMT0dFKCJrZXltYXN0ZXJfY3JlYXRlX2tleSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNjcnlwdF9rZXltYXN0ZXIocGFzc3dkLCBzYWx0LCBpa2V5LCBjcnlwdF9mdHIpKSB7Ci0gICAgICAgICAgICBTTE9HRSgic2NyeXB0IGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHNjcnlwdF9rZXltYXN0ZXIocGFzc3dkLCBzYWx0LCBpa2V5LCBjcnlwdF9mdHIpKSB7CisgICAgICAgICAgICAgICAgU0xPR0UoInNjcnlwdCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotICAgIGNhc2UgS0RGX1NDUllQVDoKLSAgICAgICAgaWYgKHNjcnlwdChwYXNzd2QsIHNhbHQsIGlrZXksIGNyeXB0X2Z0cikpIHsKLSAgICAgICAgICAgIFNMT0dFKCJzY3J5cHQgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0RGX1NDUllQVDoKKyAgICAgICAgICAgIGlmIChzY3J5cHQocGFzc3dkLCBzYWx0LCBpa2V5LCBjcnlwdF9mdHIpKSB7CisgICAgICAgICAgICAgICAgU0xPR0UoInNjcnlwdCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFNMT0dFKCJJbnZhbGlkIGtkZl90eXBlIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFNMT0dFKCJJbnZhbGlkIGtkZl90eXBlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGVjcnlwdGlvbiBlbmdpbmUgKi8KICAgICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZlX2N0eCk7Ci0gICAgaWYgKCEgRVZQX0VuY3J5cHRJbml0X2V4KCZlX2N0eCwgRVZQX2Flc18xMjhfY2JjKCksIE5VTEwsIGlrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlrZXkrSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpKSB7CisgICAgaWYgKCFFVlBfRW5jcnlwdEluaXRfZXgoJmVfY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwgaWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpa2V5ICsgSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpKSB7CiAgICAgICAgIFNMT0dFKCJFVlBfRW5jcnlwdEluaXQgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZygmZV9jdHgsIDApOyAvKiBUdXJuIG9mZiBwYWRkaW5nIGFzIG91ciBkYXRhIGlzIGJsb2NrIGFsaWduZWQgKi8KIAogICAgIC8qIEVuY3J5cHQgdGhlIG1hc3RlciBrZXkgKi8KLSAgICBpZiAoISBFVlBfRW5jcnlwdFVwZGF0ZSgmZV9jdHgsIGVuY3J5cHRlZF9tYXN0ZXJfa2V5LCAmZW5jcnlwdGVkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgY3J5cHRfZnRyLT5rZXlzaXplKSkgeworICAgIGlmICghRVZQX0VuY3J5cHRVcGRhdGUoJmVfY3R4LCBlbmNyeXB0ZWRfbWFzdGVyX2tleSwgJmVuY3J5cHRlZF9sZW4sIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5rZXlzaXplKSkgewogICAgICAgICBTTE9HRSgiRVZQX0VuY3J5cHRVcGRhdGUgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBpZiAoISBFVlBfRW5jcnlwdEZpbmFsX2V4KCZlX2N0eCwgZW5jcnlwdGVkX21hc3Rlcl9rZXkgKyBlbmNyeXB0ZWRfbGVuLCAmZmluYWxfbGVuKSkgeworICAgIGlmICghRVZQX0VuY3J5cHRGaW5hbF9leCgmZV9jdHgsIGVuY3J5cHRlZF9tYXN0ZXJfa2V5ICsgZW5jcnlwdGVkX2xlbiwgJmZpbmFsX2xlbikpIHsKICAgICAgICAgU0xPR0UoIkVWUF9FbmNyeXB0RmluYWwgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTEzMTYsMTMgKzEyNzgsMTIgQEAKICAgICBpbnQgciA9IDEgPDwgY3J5cHRfZnRyLT5yX2ZhY3RvcjsKICAgICBpbnQgcCA9IDEgPDwgY3J5cHRfZnRyLT5wX2ZhY3RvcjsKIAotICAgIHJjID0gY3J5cHRvX3NjcnlwdChpa2V5LCBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUywKLSAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5zYWx0LCBzaXplb2YoY3J5cHRfZnRyLT5zYWx0KSwgTiwgciwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5zY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LAorICAgIHJjID0gY3J5cHRvX3NjcnlwdChpa2V5LCBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUywgY3J5cHRfZnRyLT5zYWx0LCBzaXplb2YoY3J5cHRfZnRyLT5zYWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgTiwgciwgcCwgY3J5cHRfZnRyLT5zY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LAogICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY3J5cHRfZnRyLT5zY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KSk7CiAKICAgICBpZiAocmMpIHsKLSAgICAgIFNMT0dFKCJlbmNyeXB0X21hc3Rlcl9rZXk6IGNyeXB0b19zY3J5cHQgZmFpbGVkIik7CisgICAgICAgIFNMT0dFKCJlbmNyeXB0X21hc3Rlcl9rZXk6IGNyeXB0b19zY3J5cHQgZmFpbGVkIik7CiAgICAgfQogCiAgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmZV9jdHgpOwpAQCAtMTMzMCw2MCArMTI5MSw1NyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY3J5cHRfbWFzdGVyX2tleV9hdXgoY29uc3QgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpzYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlY3J5cHRlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtkZl9mdW5jIGtkZiwgdm9pZCAqa2RmX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiogaW50ZXJtZWRpYXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGludGVybWVkaWF0ZV9rZXlfc2l6ZSkKLXsKLSAgdW5zaWduZWQgY2hhciBpa2V5W0lOVEVSTUVESUFURV9CVUZfU0laRV0gPSB7IDAgfTsKLSAgRVZQX0NJUEhFUl9DVFggZF9jdHg7Ci0gIGludCBkZWNyeXB0ZWRfbGVuLCBmaW5hbF9sZW47CitzdGF0aWMgaW50IGRlY3J5cHRfbWFzdGVyX2tleV9hdXgoY29uc3QgY2hhciogcGFzc3dkLCB1bnNpZ25lZCBjaGFyKiBzYWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGVuY3J5cHRlZF9tYXN0ZXJfa2V5LCBzaXplX3Qga2V5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBkZWNyeXB0ZWRfbWFzdGVyX2tleSwga2RmX2Z1bmMga2RmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGtkZl9wYXJhbXMsIHVuc2lnbmVkIGNoYXIqKiBpbnRlcm1lZGlhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogaW50ZXJtZWRpYXRlX2tleV9zaXplKSB7CisgICAgdW5zaWduZWQgY2hhciBpa2V5W0lOVEVSTUVESUFURV9CVUZfU0laRV0gPSB7MH07CisgICAgRVZQX0NJUEhFUl9DVFggZF9jdHg7CisgICAgaW50IGRlY3J5cHRlZF9sZW4sIGZpbmFsX2xlbjsKIAotICAvKiBUdXJuIHRoZSBwYXNzd29yZCBpbnRvIGFuIGludGVybWVkaWF0ZSBrZXkgYW5kIElWIHRoYXQgY2FuIGRlY3J5cHQgdGhlCi0gICAgIG1hc3RlciBrZXkgKi8KLSAgaWYgKGtkZihwYXNzd2QsIHNhbHQsIGlrZXksIGtkZl9wYXJhbXMpKSB7Ci0gICAgU0xPR0UoImtkZiBmYWlsZWQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBkZWNyeXB0aW9uIGVuZ2luZSAqLwotICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZkX2N0eCk7Ci0gIGlmICghIEVWUF9EZWNyeXB0SW5pdF9leCgmZF9jdHgsIEVWUF9hZXNfMTI4X2NiYygpLCBOVUxMLCBpa2V5LCBpa2V5K0lOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZygmZF9jdHgsIDApOyAvKiBUdXJuIG9mZiBwYWRkaW5nIGFzIG91ciBkYXRhIGlzIGJsb2NrIGFsaWduZWQgKi8KLSAgLyogRGVjcnlwdCB0aGUgbWFzdGVyIGtleSAqLwotICBpZiAoISBFVlBfRGVjcnlwdFVwZGF0ZSgmZF9jdHgsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCAmZGVjcnlwdGVkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfbWFzdGVyX2tleSwga2V5c2l6ZSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKCEgRVZQX0RlY3J5cHRGaW5hbF9leCgmZF9jdHgsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5ICsgZGVjcnlwdGVkX2xlbiwgJmZpbmFsX2xlbikpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoZGVjcnlwdGVkX2xlbiArIGZpbmFsX2xlbiAhPSBzdGF0aWNfY2FzdDxpbnQ+KGtleXNpemUpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyogQ29weSBpbnRlcm1lZGlhdGUga2V5IGlmIG5lZWRlZCBieSBwYXJhbXMgKi8KLSAgaWYgKGludGVybWVkaWF0ZV9rZXkgJiYgaW50ZXJtZWRpYXRlX2tleV9zaXplKSB7Ci0gICAgKmludGVybWVkaWF0ZV9rZXkgPSAodW5zaWduZWQgY2hhciopIG1hbGxvYyhJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyk7Ci0gICAgaWYgKCppbnRlcm1lZGlhdGVfa2V5KSB7Ci0gICAgICBtZW1jcHkoKmludGVybWVkaWF0ZV9rZXksIGlrZXksIElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKTsKLSAgICAgICppbnRlcm1lZGlhdGVfa2V5X3NpemUgPSBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUzsKKyAgICAvKiBUdXJuIHRoZSBwYXNzd29yZCBpbnRvIGFuIGludGVybWVkaWF0ZSBrZXkgYW5kIElWIHRoYXQgY2FuIGRlY3J5cHQgdGhlCisgICAgICAgbWFzdGVyIGtleSAqLworICAgIGlmIChrZGYocGFzc3dkLCBzYWx0LCBpa2V5LCBrZGZfcGFyYW1zKSkgeworICAgICAgICBTTE9HRSgia2RmIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICB9CiAKLSAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmZF9jdHgpOworICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY3J5cHRpb24gZW5naW5lICovCisgICAgRVZQX0NJUEhFUl9DVFhfaW5pdCgmZF9jdHgpOworICAgIGlmICghRVZQX0RlY3J5cHRJbml0X2V4KCZkX2N0eCwgRVZQX2Flc18xMjhfY2JjKCksIE5VTEwsIGlrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWtleSArIElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCZkX2N0eCwgMCk7IC8qIFR1cm4gb2ZmIHBhZGRpbmcgYXMgb3VyIGRhdGEgaXMgYmxvY2sgYWxpZ25lZCAqLworICAgIC8qIERlY3J5cHQgdGhlIG1hc3RlciBrZXkgKi8KKyAgICBpZiAoIUVWUF9EZWNyeXB0VXBkYXRlKCZkX2N0eCwgZGVjcnlwdGVkX21hc3Rlcl9rZXksICZkZWNyeXB0ZWRfbGVuLCBlbmNyeXB0ZWRfbWFzdGVyX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNpemUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFFVlBfRGVjcnlwdEZpbmFsX2V4KCZkX2N0eCwgZGVjcnlwdGVkX21hc3Rlcl9rZXkgKyBkZWNyeXB0ZWRfbGVuLCAmZmluYWxfbGVuKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0gIHJldHVybiAwOworICAgIGlmIChkZWNyeXB0ZWRfbGVuICsgZmluYWxfbGVuICE9IHN0YXRpY19jYXN0PGludD4oa2V5c2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIENvcHkgaW50ZXJtZWRpYXRlIGtleSBpZiBuZWVkZWQgYnkgcGFyYW1zICovCisgICAgaWYgKGludGVybWVkaWF0ZV9rZXkgJiYgaW50ZXJtZWRpYXRlX2tleV9zaXplKSB7CisgICAgICAgICppbnRlcm1lZGlhdGVfa2V5ID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyk7CisgICAgICAgIGlmICgqaW50ZXJtZWRpYXRlX2tleSkgeworICAgICAgICAgICAgbWVtY3B5KCppbnRlcm1lZGlhdGVfa2V5LCBpa2V5LCBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyk7CisgICAgICAgICAgICAqaW50ZXJtZWRpYXRlX2tleV9zaXplID0gSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZkX2N0eCk7CisKKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZ2V0X2tkZl9mdW5jKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIsIGtkZl9mdW5jICprZGYsIHZvaWQqKiBrZGZfcGFyYW1zKQoteworc3RhdGljIHZvaWQgZ2V0X2tkZl9mdW5jKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIsIGtkZl9mdW5jKiBrZGYsIHZvaWQqKiBrZGZfcGFyYW1zKSB7CiAgICAgaWYgKGZ0ci0+a2RmX3R5cGUgPT0gS0RGX1NDUllQVF9LRVlNQVNURVIpIHsKICAgICAgICAgKmtkZiA9IHNjcnlwdF9rZXltYXN0ZXI7CiAgICAgICAgICprZGZfcGFyYW1zID0gZnRyOwpAQCAtMTM5NiwyMCArMTM1NCwxNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCBkZWNyeXB0X21hc3Rlcl9rZXkoY29uc3QgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpkZWNyeXB0ZWRfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiogaW50ZXJtZWRpYXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogaW50ZXJtZWRpYXRlX2tleV9zaXplKQoteworc3RhdGljIGludCBkZWNyeXB0X21hc3Rlcl9rZXkoY29uc3QgY2hhciogcGFzc3dkLCB1bnNpZ25lZCBjaGFyKiBkZWNyeXB0ZWRfbWFzdGVyX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIsIHVuc2lnbmVkIGNoYXIqKiBpbnRlcm1lZGlhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBpbnRlcm1lZGlhdGVfa2V5X3NpemUpIHsKICAgICBrZGZfZnVuYyBrZGY7Ci0gICAgdm9pZCAqa2RmX3BhcmFtczsKKyAgICB2b2lkKiBrZGZfcGFyYW1zOwogICAgIGludCByZXQ7CiAKICAgICBnZXRfa2RmX2Z1bmMoY3J5cHRfZnRyLCAma2RmLCAma2RmX3BhcmFtcyk7Ci0gICAgcmV0ID0gZGVjcnlwdF9tYXN0ZXJfa2V5X2F1eChwYXNzd2QsIGNyeXB0X2Z0ci0+c2FsdCwgY3J5cHRfZnRyLT5tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5rZXlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGtkZiwga2RmX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9rZXksIGludGVybWVkaWF0ZV9rZXlfc2l6ZSk7CisgICAgcmV0ID0gZGVjcnlwdF9tYXN0ZXJfa2V5X2F1eChwYXNzd2QsIGNyeXB0X2Z0ci0+c2FsdCwgY3J5cHRfZnRyLT5tYXN0ZXJfa2V5LCBjcnlwdF9mdHItPmtleXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ZWRfbWFzdGVyX2tleSwga2RmLCBrZGZfcGFyYW1zLCBpbnRlcm1lZGlhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX2tleV9zaXplKTsKICAgICBpZiAocmV0ICE9IDApIHsKICAgICAgICAgU0xPR1coImZhaWx1cmUgZGVjcnlwdGluZyBtYXN0ZXIga2V5Iik7CiAgICAgfQpAQCAtMTQxNywxMyArMTM3MiwxMyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY3JlYXRlX2VuY3J5cHRlZF9yYW5kb21fa2V5KGNvbnN0IGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqbWFzdGVyX2tleSwgdW5zaWduZWQgY2hhciAqc2FsdCwKLSAgICAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikgeworc3RhdGljIGludCBjcmVhdGVfZW5jcnlwdGVkX3JhbmRvbV9rZXkoY29uc3QgY2hhciogcGFzc3dkLCB1bnNpZ25lZCBjaGFyKiBtYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogc2FsdCwgc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgewogICAgIGludCBmZDsKICAgICB1bnNpZ25lZCBjaGFyIGtleV9idWZbTUFYX0tFWV9MRU5dOwogCiAgICAgLyogR2V0IHNvbWUgcmFuZG9tIGJpdHMgZm9yIGEga2V5ICovCi0gICAgZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWXxPX0NMT0VYRUMpOworICAgIGZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwogICAgIHJlYWQoZmQsIGtleV9idWYsIHNpemVvZihrZXlfYnVmKSk7CiAgICAgcmVhZChmZCwgc2FsdCwgU0FMVF9MRU4pOwogICAgIGNsb3NlKGZkKTsKQEAgLTE0MzIsMTMgKzEzODcsMTIgQEAKICAgICByZXR1cm4gZW5jcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgc2FsdCwga2V5X2J1ZiwgbWFzdGVyX2tleSwgY3J5cHRfZnRyKTsKIH0KIAotaW50IHdhaXRfYW5kX3VubW91bnQoY29uc3QgY2hhciAqbW91bnRwb2ludCwgYm9vbCBraWxsKQoteworaW50IHdhaXRfYW5kX3VubW91bnQoY29uc3QgY2hhciogbW91bnRwb2ludCwgYm9vbCBraWxsKSB7CiAgICAgaW50IGksIGVyciwgcmM7CiAjZGVmaW5lIFdBSVRfVU5NT1VOVF9DT1VOVCAyMAogCiAgICAgLyogIE5vdyB1bW91bnQgdGhlIHRtcGZzIGZpbGVzeXN0ZW0gKi8KLSAgICBmb3IgKGk9MDsgaTxXQUlUX1VOTU9VTlRfQ09VTlQ7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBXQUlUX1VOTU9VTlRfQ09VTlQ7IGkrKykgewogICAgICAgICBpZiAodW1vdW50KG1vdW50cG9pbnQpID09IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNDY3LDE5ICsxNDIxLDE4IEBACiAgICAgfQogCiAgICAgaWYgKGkgPCBXQUlUX1VOTU9VTlRfQ09VTlQpIHsKLSAgICAgIFNMT0dEKCJ1bm1vdW50aW5nICVzIHN1Y2NlZWRlZFxuIiwgbW91bnRwb2ludCk7Ci0gICAgICByYyA9IDA7CisgICAgICAgIFNMT0dEKCJ1bm1vdW50aW5nICVzIHN1Y2NlZWRlZFxuIiwgbW91bnRwb2ludCk7CisgICAgICAgIHJjID0gMDsKICAgICB9IGVsc2UgewotICAgICAgYW5kcm9pZDo6dm9sZDo6S2lsbFByb2Nlc3Nlc1dpdGhPcGVuRmlsZXMobW91bnRwb2ludCwgMCk7Ci0gICAgICBTTE9HRSgidW5tb3VudGluZyAlcyBmYWlsZWQ6ICVzXG4iLCBtb3VudHBvaW50LCBzdHJlcnJvcihlcnIpKTsKLSAgICAgIHJjID0gLTE7CisgICAgICAgIGFuZHJvaWQ6OnZvbGQ6OktpbGxQcm9jZXNzZXNXaXRoT3BlbkZpbGVzKG1vdW50cG9pbnQsIDApOworICAgICAgICBTTE9HRSgidW5tb3VudGluZyAlcyBmYWlsZWQ6ICVzXG4iLCBtb3VudHBvaW50LCBzdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmMgPSAtMTsKICAgICB9CiAKICAgICByZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIHByZXBfZGF0YV9mcyh2b2lkKQoteworc3RhdGljIHZvaWQgcHJlcF9kYXRhX2ZzKHZvaWQpIHsKICAgICAvLyBOT1RFOiBwb3N0X2ZzX2RhdGEgcmVzdWx0cyBpbiBpbml0IGNhbGxpbmcgYmFjayBhcm91bmQgdG8gdm9sZCwgc28gYWxsCiAgICAgLy8gY2FsbGVycyB0byB0aGlzIG1ldGhvZCBtdXN0IGJlIGFzeW5jCiAKQEAgLTE0ODksMTcgKzE0NDIsMTQgQEAKICAgICBTTE9HRCgiSnVzdCB0cmlnZ2VyZWQgcG9zdF9mc19kYXRhIik7CiAKICAgICAvKiBXYWl0IGEgbWF4IG9mIDUwIHNlY29uZHMsIGhvcGVmdWxseSBpdCB0YWtlcyBtdWNoIGxlc3MgKi8KLSAgICB3aGlsZSAoIWFuZHJvaWQ6OmJhc2U6OldhaXRGb3JQcm9wZXJ0eSgidm9sZC5wb3N0X2ZzX2RhdGFfZG9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDE1KSkpIHsKKyAgICB3aGlsZSAoIWFuZHJvaWQ6OmJhc2U6OldhaXRGb3JQcm9wZXJ0eSgidm9sZC5wb3N0X2ZzX2RhdGFfZG9uZSIsICIxIiwgc3RkOjpjaHJvbm86OnNlY29uZHMoMTUpKSkgewogICAgICAgICAvKiBXZSB0aW1lZCBvdXQgdG8gcHJlcCAvZGF0YSBpbiB0aW1lLiAgQ29udGludWUgd2FpdC4gKi8KICAgICAgICAgU0xPR0UoIndhaXRlZCAxNXMgZm9yIHZvbGQucG9zdF9mc19kYXRhX2RvbmUsIHN0aWxsIHdhaXRpbmcuLi4iKTsKICAgICB9CiAgICAgU0xPR0QoInBvc3RfZnNfZGF0YSBkb25lIik7CiB9CiAKLXN0YXRpYyB2b2lkIGNyeXB0ZnNfc2V0X2NvcnJ1cHQoKQoteworc3RhdGljIHZvaWQgY3J5cHRmc19zZXRfY29ycnVwdCgpIHsKICAgICAvLyBNYXJrIHRoZSBmb290ZXIgYXMgYmFkCiAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgY3J5cHRfZnRyOwogICAgIGlmIChnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKQEAgLTE1MTQsMTEgKzE0NjQsMTAgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNyeXB0ZnNfdHJpZ2dlcl9yZXN0YXJ0X21pbl9mcmFtZXdvcmsoKQoteworc3RhdGljIHZvaWQgY3J5cHRmc190cmlnZ2VyX3Jlc3RhcnRfbWluX2ZyYW1ld29yaygpIHsKICAgICBpZiAoZnNfbWdyX2RvX3RtcGZzX21vdW50KERBVEFfTU5UX1BPSU5UKSkgewotICAgICAgU0xPR0UoIkZhaWxlZCB0byBtb3VudCB0bXBmcyBvbiBkYXRhIC0gcGFuaWMiKTsKLSAgICAgIHJldHVybjsKKyAgICAgICAgU0xPR0UoIkZhaWxlZCB0byBtb3VudCB0bXBmcyBvbiBkYXRhIC0gcGFuaWMiKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlmIChwcm9wZXJ0eV9zZXQoInZvbGQuZGVjcnlwdCIsICJ0cmlnZ2VyX3Bvc3RfZnNfZGF0YSIpKSB7CkBAIC0xNTMzLDE0ICsxNDgyLDEzIEBACiB9CiAKIC8qIHJldHVybnMgPCAwIG9uIGZhaWx1cmUgKi8KLXN0YXRpYyBpbnQgY3J5cHRmc19yZXN0YXJ0X2ludGVybmFsKGludCByZXN0YXJ0X21haW4pCi17CitzdGF0aWMgaW50IGNyeXB0ZnNfcmVzdGFydF9pbnRlcm5hbChpbnQgcmVzdGFydF9tYWluKSB7CiAgICAgY2hhciBjcnlwdG9fYmxrZGV2W01BWFBBVEhMRU5dOwogICAgIGludCByYyA9IC0xOwogICAgIHN0YXRpYyBpbnQgcmVzdGFydF9zdWNjZXNzZnVsID0gMDsKIAogICAgIC8qIFZhbGlkYXRlIHRoYXQgaXQncyBPSyB0byBjYWxsIHRoaXMgcm91dGluZSAqLwotICAgIGlmICghIG1hc3Rlcl9rZXlfc2F2ZWQpIHsKKyAgICBpZiAoIW1hc3Rlcl9rZXlfc2F2ZWQpIHsKICAgICAgICAgU0xPR0UoIkVuY3J5cHRlZCBmaWxlc3lzdGVtIG5vdCB2YWxpZGF0ZWQsIGFib3J0aW5nIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0xNTg5LDcgKzE1MzcsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKCEgKHJjID0gd2FpdF9hbmRfdW5tb3VudChEQVRBX01OVF9QT0lOVCwgdHJ1ZSkpICkgeworICAgIGlmICghKHJjID0gd2FpdF9hbmRfdW5tb3VudChEQVRBX01OVF9QT0lOVCwgdHJ1ZSkpKSB7CiAgICAgICAgIC8qIElmIHJvLmNyeXB0by5yZWFkb25seSBpcyBzZXQgdG8gMSwgbW91bnQgdGhlIGRlY3J5cHRlZAogICAgICAgICAgKiBmaWxlc3lzdGVtIHJlYWRvbmx5LiAgVGhpcyBpcyB1c2VkIHdoZW4gL2RhdGEgaXMgbW91bnRlZCBieQogICAgICAgICAgKiByZWNvdmVyeSBtb2RlLgpAQCAtMTU5OCw3ICsxNTQ2LDkgQEAKICAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8ucmVhZG9ubHkiLCByb19wcm9wLCAiIik7CiAgICAgICAgIGlmIChzdHJsZW4ocm9fcHJvcCkgPiAwICYmIHN0ZDo6c3RvaShyb19wcm9wKSkgewogICAgICAgICAgICAgc3RydWN0IGZzdGFiX3JlYyogcmVjID0gZnNfbWdyX2dldF9lbnRyeV9mb3JfbW91bnRfcG9pbnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQpOwotICAgICAgICAgICAgcmVjLT5mbGFncyB8PSBNU19SRE9OTFk7CisgICAgICAgICAgICBpZiAocmVjKSB7CisgICAgICAgICAgICAgICAgcmVjLT5mbGFncyB8PSBNU19SRE9OTFk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKiBJZiB0aGF0IHN1Y2NlZWRlZCwgdGhlbiBtb3VudCB0aGUgZGVjcnlwdGVkIGZpbGVzeXN0ZW0gKi8KQEAgLTE2MDksMTkgKzE1NTksMTggQEAKICAgICAgICAgICogZnNfbWdyX2RvX21vdW50IHJ1bnMgZnNjay4gVXNlIHNldGV4ZWNjb24gdG8gcnVuIHRydXN0ZWQKICAgICAgICAgICogcGFydGl0aW9ucyBpbiB0aGUgZnNjayBkb21haW4uCiAgICAgICAgICAqLwotICAgICAgICBpZiAoc2V0ZXhlY2NvbihzZWNvbnRleHRGc2NrKCkpKXsKKyAgICAgICAgaWYgKHNldGV4ZWNjb24oc2Vjb250ZXh0RnNjaygpKSkgewogICAgICAgICAgICAgU0xPR0UoIkZhaWxlZCB0byBzZXRleGVjY29uIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChtb3VudF9yYyA9IGZzX21ncl9kb19tb3VudChmc3RhYl9kZWZhdWx0LCBEQVRBX01OVF9QT0lOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG9fYmxrZGV2LCAwKSkKLSAgICAgICAgICAgICAgICE9IDApIHsKKyAgICAgICAgYm9vbCBuZWVkc19jcCA9IGFuZHJvaWQ6OnZvbGQ6OmNwX25lZWRzQ2hlY2twb2ludCgpOworICAgICAgICB3aGlsZSAoKG1vdW50X3JjID0gZnNfbWdyX2RvX21vdW50KGZzdGFiX2RlZmF1bHQsIERBVEFfTU5UX1BPSU5ULCBjcnlwdG9fYmxrZGV2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzX2NwKSkgIT0gMCkgewogICAgICAgICAgICAgaWYgKG1vdW50X3JjID09IEZTX01HUl9ET01OVF9CVVNZKSB7CiAgICAgICAgICAgICAgICAgLyogVE9ETzogaW52b2tlIHNvbWV0aGluZyBzaW1pbGFyIHRvCiAgICAgICAgICAgICAgICAgICAgUHJvY2Vzczo6a2lsbFByb2Nlc3NXaXRoT3BlbkZpbGVzKERBVEFfTU5UX1BPSU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzID4gUkVUUllfTU9VTlRfQVRURU1QVC8yID8gMSA6IDIgKSAqLwotICAgICAgICAgICAgICAgIFNMT0dJKCJGYWlsZWQgdG8gbW91bnQgJXMgYmVjYXVzZSBpdCBpcyBidXN5IC0gd2FpdGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgY3J5cHRvX2Jsa2Rldik7CisgICAgICAgICAgICAgICAgU0xPR0koIkZhaWxlZCB0byBtb3VudCAlcyBiZWNhdXNlIGl0IGlzIGJ1c3kgLSB3YWl0aW5nIiwgY3J5cHRvX2Jsa2Rldik7CiAgICAgICAgICAgICAgICAgaWYgKC0tcmV0cmllcykgewogICAgICAgICAgICAgICAgICAgICBzbGVlcChSRVRSWV9NT1VOVF9ERUxBWV9TRUNPTkRTKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTY2NCwxMCArMTYxMyw5IEBACiAgICAgcmV0dXJuIHJjOwogfQogCi1pbnQgY3J5cHRmc19yZXN0YXJ0KHZvaWQpCi17CitpbnQgY3J5cHRmc19yZXN0YXJ0KHZvaWQpIHsKICAgICBTTE9HSSgiY3J5cHRmc19yZXN0YXJ0Iik7Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICBTTE9HRSgiY3J5cHRmc19yZXN0YXJ0IG5vdCB2YWxpZCBmb3IgZmlsZSBlbmNyeXB0aW9uOiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTY3NiwxOTMgKzE2MjQsMTg5IEBACiAgICAgcmV0dXJuIGNyeXB0ZnNfcmVzdGFydF9pbnRlcm5hbCgxKTsKIH0KIAotc3RhdGljIGludCBkb19jcnlwdG9fY29tcGxldGUoY29uc3QgY2hhciAqbW91bnRfcG9pbnQpCi17Ci0gIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKLSAgY2hhciBlbmNyeXB0ZWRfc3RhdGVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgY2hhciBrZXlfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07CitzdGF0aWMgaW50IGRvX2NyeXB0b19jb21wbGV0ZShjb25zdCBjaGFyKiBtb3VudF9wb2ludCkgeworICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKKyAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNoYXIga2V5X2xvY1tQUk9QRVJUWV9WQUxVRV9NQVhdOwogCi0gIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gIGlmIChzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikgKSB7Ci0gICAgU0xPR0UoIm5vdCBydW5uaW5nIHdpdGggZW5jcnlwdGlvbiwgYWJvcnRpbmciKTsKLSAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQ7Ci0gIH0KLQotICAvLyBjcnlwdG9fY29tcGxldGUgaXMgZnVsbCBkaXNrIGVuY3J5cHRlZCBzdGF0dXMKLSAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKLSAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQ7Ci0gIH0KLQotICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpKSB7Ci0gICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIGtleV9sb2MsIDAsIHNpemVvZihrZXlfbG9jKSk7Ci0KLSAgICAvKgotICAgICAqIE9ubHkgcmVwb3J0IHRoaXMgZXJyb3IgaWYga2V5X2xvYyBpcyBhIGZpbGUgYW5kIGl0IGV4aXN0cy4KLSAgICAgKiBJZiB0aGUgZGV2aWNlIHdhcyBuZXZlciBlbmNyeXB0ZWQsIGFuZCAvZGF0YSBpcyBub3QgbW91bnRhYmxlIGZvcgotICAgICAqIHNvbWUgcmVhc29uLCByZXR1cm5pbmcgMSBzaG91bGQgcHJldmVudCB0aGUgVUkgZnJvbSBwcmVzZW50aW5nIHRoZQotICAgICAqIGEgImVudGVyIHBhc3N3b3JkIiBzY3JlZW4sIG9yIHdvcnNlLCBhICJwcmVzcyBidXR0b24gdG8gd2lwZSB0aGUKLSAgICAgKiBkZXZpY2UiIHNjcmVlbi4KLSAgICAgKi8KLSAgICBpZiAoKGtleV9sb2NbMF0gPT0gJy8nKSAmJiAoYWNjZXNzKCJrZXlfbG9jIiwgRl9PSykgPT0gLTEpKSB7Ci0gICAgICBTTE9HRSgibWFzdGVyIGtleSBmaWxlIGRvZXMgbm90IGV4aXN0LCBhYm9ydGluZyIpOwotICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEOwotICAgIH0gZWxzZSB7Ci0gICAgICBTTE9HRSgiRXJyb3IgZ2V0dGluZyBjcnlwdCBmb290ZXIgYW5kIGtleVxuIik7Ci0gICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0JBRF9NRVRBREFUQTsKKyAgICBwcm9wZXJ0eV9nZXQoInJvLmNyeXB0by5zdGF0ZSIsIGVuY3J5cHRlZF9zdGF0ZSwgIiIpOworICAgIGlmIChzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikpIHsKKyAgICAgICAgU0xPR0UoIm5vdCBydW5uaW5nIHdpdGggZW5jcnlwdGlvbiwgYWJvcnRpbmciKTsKKyAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEOwogICAgIH0KLSAgfQogCi0gIC8vIFRlc3QgZm9yIHBvc3NpYmxlIGVycm9yIGZsYWdzCi0gIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTKXsKLSAgICBTTE9HRSgiRW5jcnlwdGlvbiBwcm9jZXNzIGlzIHBhcnR3YXkgY29tcGxldGVkXG4iKTsKLSAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX1BBUlRJQUw7Ci0gIH0KKyAgICAvLyBjcnlwdG9fY29tcGxldGUgaXMgZnVsbCBkaXNrIGVuY3J5cHRlZCBzdGF0dXMKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgeworICAgICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQ7CisgICAgfQogCi0gIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9JTkNPTlNJU1RFTlRfU1RBVEUpewotICAgIFNMT0dFKCJFbmNyeXB0aW9uIHByb2Nlc3Mgd2FzIGludGVycnVwdGVkIGJ1dCBjYW5ub3QgY29udGludWVcbiIpOwotICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfSU5DT05TSVNURU5UOwotICB9CisgICAgaWYgKGdldF9jcnlwdF9mdHJfYW5kX2tleSgmY3J5cHRfZnRyKSkgeworICAgICAgICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwga2V5X2xvYywgMCwgc2l6ZW9mKGtleV9sb2MpKTsKIAotICBpZiAoY3J5cHRfZnRyLmZsYWdzICYgQ1JZUFRfREFUQV9DT1JSVVBUKXsKLSAgICBTTE9HRSgiRW5jcnlwdGlvbiBpcyBzdWNjZXNzZnVsIGJ1dCBkYXRhIGlzIGNvcnJ1cHRcbiIpOwotICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfQ09SUlVQVDsKLSAgfQorICAgICAgICAvKgorICAgICAgICAgKiBPbmx5IHJlcG9ydCB0aGlzIGVycm9yIGlmIGtleV9sb2MgaXMgYSBmaWxlIGFuZCBpdCBleGlzdHMuCisgICAgICAgICAqIElmIHRoZSBkZXZpY2Ugd2FzIG5ldmVyIGVuY3J5cHRlZCwgYW5kIC9kYXRhIGlzIG5vdCBtb3VudGFibGUgZm9yCisgICAgICAgICAqIHNvbWUgcmVhc29uLCByZXR1cm5pbmcgMSBzaG91bGQgcHJldmVudCB0aGUgVUkgZnJvbSBwcmVzZW50aW5nIHRoZQorICAgICAgICAgKiBhICJlbnRlciBwYXNzd29yZCIgc2NyZWVuLCBvciB3b3JzZSwgYSAicHJlc3MgYnV0dG9uIHRvIHdpcGUgdGhlCisgICAgICAgICAqIGRldmljZSIgc2NyZWVuLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChrZXlfbG9jWzBdID09ICcvJykgJiYgKGFjY2Vzcygia2V5X2xvYyIsIEZfT0spID09IC0xKSkgeworICAgICAgICAgICAgU0xPR0UoIm1hc3RlciBrZXkgZmlsZSBkb2VzIG5vdCBleGlzdCwgYWJvcnRpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfTk9UX0VOQ1JZUFRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNMT0dFKCJFcnJvciBnZXR0aW5nIGNyeXB0IGZvb3RlciBhbmQga2V5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfQkFEX01FVEFEQVRBOworICAgICAgICB9CisgICAgfQogCi0gIC8qIFdlIHBhc3NlZCB0aGUgdGVzdCEgV2Ugc2hhbGwgZGltaW5pc2gsIGFuZCByZXR1cm4gdG8gdGhlIHdlc3QgKi8KLSAgcmV0dXJuIENSWVBUT19DT01QTEVURV9FTkNSWVBURUQ7CisgICAgLy8gVGVzdCBmb3IgcG9zc2libGUgZXJyb3IgZmxhZ3MKKyAgICBpZiAoY3J5cHRfZnRyLmZsYWdzICYgQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUykgeworICAgICAgICBTTE9HRSgiRW5jcnlwdGlvbiBwcm9jZXNzIGlzIHBhcnR3YXkgY29tcGxldGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9QQVJUSUFMOworICAgIH0KKworICAgIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9JTkNPTlNJU1RFTlRfU1RBVEUpIHsKKyAgICAgICAgU0xPR0UoIkVuY3J5cHRpb24gcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnV0IGNhbm5vdCBjb250aW51ZVxuIik7CisgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfSU5DT05TSVNURU5UOworICAgIH0KKworICAgIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9EQVRBX0NPUlJVUFQpIHsKKyAgICAgICAgU0xPR0UoIkVuY3J5cHRpb24gaXMgc3VjY2Vzc2Z1bCBidXQgZGF0YSBpcyBjb3JydXB0XG4iKTsKKyAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9DT1JSVVBUOworICAgIH0KKworICAgIC8qIFdlIHBhc3NlZCB0aGUgdGVzdCEgV2Ugc2hhbGwgZGltaW5pc2gsIGFuZCByZXR1cm4gdG8gdGhlIHdlc3QgKi8KKyAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0VOQ1JZUFRFRDsKIH0KIAotc3RhdGljIGludCB0ZXN0X21vdW50X2VuY3J5cHRlZF9mcyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IGNoYXIgKm1vdW50X3BvaW50LCBjb25zdCBjaGFyICpsYWJlbCkKLXsKLSAgdW5zaWduZWQgY2hhciBkZWNyeXB0ZWRfbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07Ci0gIGNoYXIgY3J5cHRvX2Jsa2RldltNQVhQQVRITEVOXTsKLSAgY2hhciByZWFsX2Jsa2RldltNQVhQQVRITEVOXTsKLSAgY2hhciB0bXBfbW91bnRfcG9pbnRbNjRdOwotICB1bnNpZ25lZCBpbnQgb3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudDsKLSAgaW50IHJjOwotICBpbnQgdXNlX2tleW1hc3RlciA9IDA7Ci0gIGludCB1cGdyYWRlID0gMDsKLSAgdW5zaWduZWQgY2hhciogaW50ZXJtZWRpYXRlX2tleSA9IDA7Ci0gIHNpemVfdCBpbnRlcm1lZGlhdGVfa2V5X3NpemUgPSAwOwotICBpbnQgTiA9IDEgPDwgY3J5cHRfZnRyLT5OX2ZhY3RvcjsKLSAgaW50IHIgPSAxIDw8IGNyeXB0X2Z0ci0+cl9mYWN0b3I7Ci0gIGludCBwID0gMSA8PCBjcnlwdF9mdHItPnBfZmFjdG9yOworc3RhdGljIGludCB0ZXN0X21vdW50X2VuY3J5cHRlZF9mcyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyLCBjb25zdCBjaGFyKiBwYXNzd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1vdW50X3BvaW50LCBjb25zdCBjaGFyKiBsYWJlbCkgeworICAgIHVuc2lnbmVkIGNoYXIgZGVjcnlwdGVkX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOworICAgIGNoYXIgY3J5cHRvX2Jsa2RldltNQVhQQVRITEVOXTsKKyAgICBjaGFyIHJlYWxfYmxrZGV2W01BWFBBVEhMRU5dOworICAgIGNoYXIgdG1wX21vdW50X3BvaW50WzY0XTsKKyAgICB1bnNpZ25lZCBpbnQgb3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudDsKKyAgICBpbnQgcmM7CisgICAgaW50IHVzZV9rZXltYXN0ZXIgPSAwOworICAgIGludCB1cGdyYWRlID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyKiBpbnRlcm1lZGlhdGVfa2V5ID0gMDsKKyAgICBzaXplX3QgaW50ZXJtZWRpYXRlX2tleV9zaXplID0gMDsKKyAgICBpbnQgTiA9IDEgPDwgY3J5cHRfZnRyLT5OX2ZhY3RvcjsKKyAgICBpbnQgciA9IDEgPDwgY3J5cHRfZnRyLT5yX2ZhY3RvcjsKKyAgICBpbnQgcCA9IDEgPDwgY3J5cHRfZnRyLT5wX2ZhY3RvcjsKIAotICBTTE9HRCgiY3J5cHRfZnRyLT5mc19zaXplID0gJWxsZFxuIiwgY3J5cHRfZnRyLT5mc19zaXplKTsKLSAgb3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudCA9IGNyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQ7CisgICAgU0xPR0QoImNyeXB0X2Z0ci0+ZnNfc2l6ZSA9ICVsbGRcbiIsIGNyeXB0X2Z0ci0+ZnNfc2l6ZSk7CisgICAgb3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudCA9IGNyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQ7CiAKLSAgaWYgKCEgKGNyeXB0X2Z0ci0+ZmxhZ3MgJiBDUllQVF9NTlRfS0VZX1VORU5DUllQVEVEKSApIHsKLSAgICBpZiAoZGVjcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm1lZGlhdGVfa2V5LCAmaW50ZXJtZWRpYXRlX2tleV9zaXplKSkgewotICAgICAgU0xPR0UoIkZhaWxlZCB0byBkZWNyeXB0IG1hc3RlciBrZXlcbiIpOwotICAgICAgcmMgPSAtMTsKLSAgICAgIGdvdG8gZXJyb3V0OworICAgIGlmICghKGNyeXB0X2Z0ci0+ZmxhZ3MgJiBDUllQVF9NTlRfS0VZX1VORU5DUllQVEVEKSkgeworICAgICAgICBpZiAoZGVjcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ciwgJmludGVybWVkaWF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybWVkaWF0ZV9rZXlfc2l6ZSkpIHsKKyAgICAgICAgICAgIFNMT0dFKCJGYWlsZWQgdG8gZGVjcnlwdCBtYXN0ZXIga2V5XG4iKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBnb3RvIGVycm91dDsKKyAgICAgICAgfQogICAgIH0KLSAgfQogCi0gIGZzX21ncl9nZXRfY3J5cHRfaW5mbyhmc3RhYl9kZWZhdWx0LCAwLCByZWFsX2Jsa2Rldiwgc2l6ZW9mKHJlYWxfYmxrZGV2KSk7CisgICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIDAsIHJlYWxfYmxrZGV2LCBzaXplb2YocmVhbF9ibGtkZXYpKTsKIAotICAvLyBDcmVhdGUgY3J5cHRvIGJsb2NrIGRldmljZSAtIGFsbCAobm9uIGZhdGFsKSBjb2RlIHBhdGhzCi0gIC8vIG5lZWQgaXQKLSAgaWYgKGNyZWF0ZV9jcnlwdG9fYmxrX2RldihjcnlwdF9mdHIsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCByZWFsX2Jsa2RldiwgY3J5cHRvX2Jsa2RldiwgbGFiZWwsIDApKSB7Ci0gICAgICBTTE9HRSgiRXJyb3IgY3JlYXRpbmcgZGVjcnlwdGVkIGJsb2NrIGRldmljZVxuIik7Ci0gICAgICByYyA9IC0xOwotICAgICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICAvLyBDcmVhdGUgY3J5cHRvIGJsb2NrIGRldmljZSAtIGFsbCAobm9uIGZhdGFsKSBjb2RlIHBhdGhzCisgICAgLy8gbmVlZCBpdAorICAgIGlmIChjcmVhdGVfY3J5cHRvX2Jsa19kZXYoY3J5cHRfZnRyLCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgcmVhbF9ibGtkZXYsIGNyeXB0b19ibGtkZXYsIGxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpIHsKKyAgICAgICAgU0xPR0UoIkVycm9yIGNyZWF0aW5nIGRlY3J5cHRlZCBibG9jayBkZXZpY2VcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgLyogV29yayBvdXQgaWYgdGhlIHByb2JsZW0gaXMgdGhlIHBhc3N3b3JkIG9yIHRoZSBkYXRhICovCi0gIHVuc2lnbmVkIGNoYXIgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleVtzaXplb2YoY3J5cHRfZnRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KV07CisgICAgLyogV29yayBvdXQgaWYgdGhlIHByb2JsZW0gaXMgdGhlIHBhc3N3b3JkIG9yIHRoZSBkYXRhICovCisgICAgdW5zaWduZWQgY2hhciBzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5W3NpemVvZihjcnlwdF9mdHItPnNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXkpXTsKIAotICByYyA9IGNyeXB0b19zY3J5cHQoaW50ZXJtZWRpYXRlX2tleSwgaW50ZXJtZWRpYXRlX2tleV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5zYWx0LCBzaXplb2YoY3J5cHRfZnRyLT5zYWx0KSwKLSAgICAgICAgICAgICAgICAgICAgIE4sIHIsIHAsIHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSkpOworICAgIHJjID0gY3J5cHRvX3NjcnlwdChpbnRlcm1lZGlhdGVfa2V5LCBpbnRlcm1lZGlhdGVfa2V5X3NpemUsIGNyeXB0X2Z0ci0+c2FsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNyeXB0X2Z0ci0+c2FsdCksIE4sIHIsIHAsIHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KSk7CiAKLSAgLy8gRG9lcyB0aGUga2V5IG1hdGNoIHRoZSBjcnlwdG8gZm9vdGVyPwotICBpZiAocmMgPT0gMCAmJiBtZW1jbXAoc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+c2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KSkgPT0gMCkgewotICAgIFNMT0dJKCJQYXNzd29yZCBtYXRjaGVzIik7Ci0gICAgcmMgPSAwOwotICB9IGVsc2UgewotICAgIC8qIFRyeSBtb3VudGluZyB0aGUgZmlsZSBzeXN0ZW0gYW55d2F5LCBqdXN0IGluIGNhc2UgdGhlIHByb2JsZW0ncyB3aXRoCi0gICAgICogdGhlIGZvb3Rlciwgbm90IHRoZSBrZXkuICovCi0gICAgc25wcmludGYodG1wX21vdW50X3BvaW50LCBzaXplb2YodG1wX21vdW50X3BvaW50KSwgIiVzL3RtcF9tbnQiLAotICAgICAgICAgICAgIG1vdW50X3BvaW50KTsKLSAgICBta2Rpcih0bXBfbW91bnRfcG9pbnQsIDA3NTUpOwotICAgIGlmIChmc19tZ3JfZG9fbW91bnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQsIGNyeXB0b19ibGtkZXYsIHRtcF9tb3VudF9wb2ludCkpIHsKLSAgICAgIFNMT0dFKCJFcnJvciB0ZW1wIG1vdW50aW5nIGRlY3J5cHRlZCBibG9jayBkZXZpY2VcbiIpOwotICAgICAgZGVsZXRlX2NyeXB0b19ibGtfZGV2KGxhYmVsKTsKLQotICAgICAgcmMgPSArK2NyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQ7Ci0gICAgICBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoY3J5cHRfZnRyKTsKKyAgICAvLyBEb2VzIHRoZSBrZXkgbWF0Y2ggdGhlIGNyeXB0byBmb290ZXI/CisgICAgaWYgKHJjID09IDAgJiYgbWVtY21wKHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksIGNyeXB0X2Z0ci0+c2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXkpKSA9PSAwKSB7CisgICAgICAgIFNMT0dJKCJQYXNzd29yZCBtYXRjaGVzIik7CisgICAgICAgIHJjID0gMDsKICAgICB9IGVsc2UgewotICAgICAgLyogU3VjY2VzcyEgKi8KLSAgICAgIFNMT0dJKCJQYXNzd29yZCBkaWQgbm90IG1hdGNoIGJ1dCBkZWNyeXB0ZWQgZHJpdmUgbW91bnRlZCAtIGNvbnRpbnVlIik7Ci0gICAgICB1bW91bnQodG1wX21vdW50X3BvaW50KTsKLSAgICAgIHJjID0gMDsKLSAgICB9Ci0gIH0KKyAgICAgICAgLyogVHJ5IG1vdW50aW5nIHRoZSBmaWxlIHN5c3RlbSBhbnl3YXksIGp1c3QgaW4gY2FzZSB0aGUgcHJvYmxlbSdzIHdpdGgKKyAgICAgICAgICogdGhlIGZvb3Rlciwgbm90IHRoZSBrZXkuICovCisgICAgICAgIHNucHJpbnRmKHRtcF9tb3VudF9wb2ludCwgc2l6ZW9mKHRtcF9tb3VudF9wb2ludCksICIlcy90bXBfbW50IiwgbW91bnRfcG9pbnQpOworICAgICAgICBta2Rpcih0bXBfbW91bnRfcG9pbnQsIDA3NTUpOworICAgICAgICBpZiAoZnNfbWdyX2RvX21vdW50KGZzdGFiX2RlZmF1bHQsIERBVEFfTU5UX1BPSU5ULCBjcnlwdG9fYmxrZGV2LCB0bXBfbW91bnRfcG9pbnQpKSB7CisgICAgICAgICAgICBTTE9HRSgiRXJyb3IgdGVtcCBtb3VudGluZyBkZWNyeXB0ZWQgYmxvY2sgZGV2aWNlXG4iKTsKKyAgICAgICAgICAgIGRlbGV0ZV9jcnlwdG9fYmxrX2RldihsYWJlbCk7CiAKLSAgaWYgKHJjID09IDApIHsKLSAgICBjcnlwdF9mdHItPmZhaWxlZF9kZWNyeXB0X2NvdW50ID0gMDsKLSAgICBpZiAob3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudCAhPSAwKSB7Ci0gICAgICBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoY3J5cHRfZnRyKTsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIHRoZSBuYW1lIG9mIHRoZSBjcnlwdG8gYmxvY2sgZGV2aWNlCi0gICAgICogc28gd2UgY2FuIG1vdW50IGl0IHdoZW4gcmVzdGFydGluZyB0aGUgZnJhbWV3b3JrLiAqLwotICAgIHByb3BlcnR5X3NldCgicm8uY3J5cHRvLmZzX2NyeXB0b19ibGtkZXYiLCBjcnlwdG9fYmxrZGV2KTsKLQotICAgIC8qIEFsc28gc2F2ZSBhIHRoZSBtYXN0ZXIga2V5IHNvIHdlIGNhbiByZWVuY3J5cHRlZCB0aGUga2V5Ci0gICAgICogdGhlIGtleSB3aGVuIHdlIHdhbnQgdG8gY2hhbmdlIHRoZSBwYXNzd29yZCBvbiBpdC4gKi8KLSAgICBtZW1jcHkoc2F2ZWRfbWFzdGVyX2tleSwgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ci0+a2V5c2l6ZSk7Ci0gICAgc2F2ZWRfbW91bnRfcG9pbnQgPSBzdHJkdXAobW91bnRfcG9pbnQpOwotICAgIG1hc3Rlcl9rZXlfc2F2ZWQgPSAxOwotICAgIFNMT0dEKCIlcygpOiBNYXN0ZXIga2V5IHNhdmVkXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJjID0gMDsKLQotICAgIC8vIFVwZ3JhZGUgaWYgd2UncmUgbm90IHVzaW5nIHRoZSBsYXRlc3QgS0RGLgotICAgIHVzZV9rZXltYXN0ZXIgPSBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSgpOwotICAgIGlmIChjcnlwdF9mdHItPmtkZl90eXBlID09IEtERl9TQ1JZUFRfS0VZTUFTVEVSKSB7Ci0gICAgICAgIC8vIERvbid0IGFsbG93IGRvd25ncmFkZQotICAgIH0gZWxzZSBpZiAodXNlX2tleW1hc3RlciA9PSAxICYmIGNyeXB0X2Z0ci0+a2RmX3R5cGUgIT0gS0RGX1NDUllQVF9LRVlNQVNURVIpIHsKLSAgICAgICAgY3J5cHRfZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOwotICAgICAgICB1cGdyYWRlID0gMTsKLSAgICB9IGVsc2UgaWYgKHVzZV9rZXltYXN0ZXIgPT0gMCAmJiBjcnlwdF9mdHItPmtkZl90eXBlICE9IEtERl9TQ1JZUFQpIHsKLSAgICAgICAgY3J5cHRfZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFQ7Ci0gICAgICAgIHVwZ3JhZGUgPSAxOwotICAgIH0KLQotICAgIGlmICh1cGdyYWRlKSB7Ci0gICAgICAgIHJjID0gZW5jcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgY3J5cHRfZnRyLT5zYWx0LCBzYXZlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHItPm1hc3Rlcl9rZXksIGNyeXB0X2Z0cik7Ci0gICAgICAgIGlmICghcmMpIHsKLSAgICAgICAgICAgIHJjID0gcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KGNyeXB0X2Z0cik7Ci0gICAgICAgIH0KLSAgICAgICAgU0xPR0QoIktleSBEZXJpdmF0aW9uIEZ1bmN0aW9uIHVwZ3JhZGU6IHJjPSVkXG4iLCByYyk7Ci0KLSAgICAgICAgLy8gRG8gbm90IGZhaWwgZXZlbiBpZiB1cGdyYWRlIGZhaWxlZCAtIG1hY2hpbmUgaXMgYm9vdGFibGUKLSAgICAgICAgLy8gTm90ZSB0aGF0IGlmIHRoaXMgY29kZSBpcyBldmVyIGhpdCwgdGhlcmUgaXMgYSAqc2VyaW91cyogcHJvYmxlbQotICAgICAgICAvLyBzaW5jZSBLREZzIHNob3VsZCBuZXZlciBmYWlsLiBZb3UgKm11c3QqIGZpeCB0aGUga2RmIGJlZm9yZQotICAgICAgICAvLyBwcm9jZWVkaW5nIQotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICBTTE9HVygiVXBncmFkZSBmYWlsZWQgd2l0aCBlcnJvciAlZCwiCi0gICAgICAgICAgICAgICAgIiBidXQgY29udGludWluZyB3aXRoIHByZXZpb3VzIHN0YXRlIiwKLSAgICAgICAgICAgICAgICByYyk7Ci0gICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgcmMgPSArK2NyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQ7CisgICAgICAgICAgICBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoY3J5cHRfZnRyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFN1Y2Nlc3MhICovCisgICAgICAgICAgICBTTE9HSSgiUGFzc3dvcmQgZGlkIG5vdCBtYXRjaCBidXQgZGVjcnlwdGVkIGRyaXZlIG1vdW50ZWQgLSBjb250aW51ZSIpOworICAgICAgICAgICAgdW1vdW50KHRtcF9tb3VudF9wb2ludCk7CisgICAgICAgICAgICByYyA9IDA7CiAgICAgICAgIH0KICAgICB9Ci0gIH0KIAotIGVycm91dDoKLSAgaWYgKGludGVybWVkaWF0ZV9rZXkpIHsKLSAgICBtZW1zZXQoaW50ZXJtZWRpYXRlX2tleSwgMCwgaW50ZXJtZWRpYXRlX2tleV9zaXplKTsKLSAgICBmcmVlKGludGVybWVkaWF0ZV9rZXkpOwotICB9Ci0gIHJldHVybiByYzsKKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgICBjcnlwdF9mdHItPmZhaWxlZF9kZWNyeXB0X2NvdW50ID0gMDsKKyAgICAgICAgaWYgKG9yaWdfZmFpbGVkX2RlY3J5cHRfY291bnQgIT0gMCkgeworICAgICAgICAgICAgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KGNyeXB0X2Z0cik7CisgICAgICAgIH0KKworICAgICAgICAvKiBTYXZlIHRoZSBuYW1lIG9mIHRoZSBjcnlwdG8gYmxvY2sgZGV2aWNlCisgICAgICAgICAqIHNvIHdlIGNhbiBtb3VudCBpdCB3aGVuIHJlc3RhcnRpbmcgdGhlIGZyYW1ld29yay4gKi8KKyAgICAgICAgcHJvcGVydHlfc2V0KCJyby5jcnlwdG8uZnNfY3J5cHRvX2Jsa2RldiIsIGNyeXB0b19ibGtkZXYpOworCisgICAgICAgIC8qIEFsc28gc2F2ZSBhIHRoZSBtYXN0ZXIga2V5IHNvIHdlIGNhbiByZWVuY3J5cHRlZCB0aGUga2V5CisgICAgICAgICAqIHRoZSBrZXkgd2hlbiB3ZSB3YW50IHRvIGNoYW5nZSB0aGUgcGFzc3dvcmQgb24gaXQuICovCisgICAgICAgIG1lbWNweShzYXZlZF9tYXN0ZXJfa2V5LCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgY3J5cHRfZnRyLT5rZXlzaXplKTsKKyAgICAgICAgc2F2ZWRfbW91bnRfcG9pbnQgPSBzdHJkdXAobW91bnRfcG9pbnQpOworICAgICAgICBtYXN0ZXJfa2V5X3NhdmVkID0gMTsKKyAgICAgICAgU0xPR0QoIiVzKCk6IE1hc3RlciBrZXkgc2F2ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJjID0gMDsKKworICAgICAgICAvLyBVcGdyYWRlIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgbGF0ZXN0IEtERi4KKyAgICAgICAgdXNlX2tleW1hc3RlciA9IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5KCk7CisgICAgICAgIGlmIChjcnlwdF9mdHItPmtkZl90eXBlID09IEtERl9TQ1JZUFRfS0VZTUFTVEVSKSB7CisgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyBkb3duZ3JhZGUKKyAgICAgICAgfSBlbHNlIGlmICh1c2Vfa2V5bWFzdGVyID09IDEgJiYgY3J5cHRfZnRyLT5rZGZfdHlwZSAhPSBLREZfU0NSWVBUX0tFWU1BU1RFUikgeworICAgICAgICAgICAgY3J5cHRfZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOworICAgICAgICAgICAgdXBncmFkZSA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAodXNlX2tleW1hc3RlciA9PSAwICYmIGNyeXB0X2Z0ci0+a2RmX3R5cGUgIT0gS0RGX1NDUllQVCkgeworICAgICAgICAgICAgY3J5cHRfZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFQ7CisgICAgICAgICAgICB1cGdyYWRlID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cGdyYWRlKSB7CisgICAgICAgICAgICByYyA9IGVuY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIGNyeXB0X2Z0ci0+c2FsdCwgc2F2ZWRfbWFzdGVyX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+bWFzdGVyX2tleSwgY3J5cHRfZnRyKTsKKyAgICAgICAgICAgIGlmICghcmMpIHsKKyAgICAgICAgICAgICAgICByYyA9IHB1dF9jcnlwdF9mdHJfYW5kX2tleShjcnlwdF9mdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0xPR0QoIktleSBEZXJpdmF0aW9uIEZ1bmN0aW9uIHVwZ3JhZGU6IHJjPSVkXG4iLCByYyk7CisKKyAgICAgICAgICAgIC8vIERvIG5vdCBmYWlsIGV2ZW4gaWYgdXBncmFkZSBmYWlsZWQgLSBtYWNoaW5lIGlzIGJvb3RhYmxlCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaWYgdGhpcyBjb2RlIGlzIGV2ZXIgaGl0LCB0aGVyZSBpcyBhICpzZXJpb3VzKiBwcm9ibGVtCisgICAgICAgICAgICAvLyBzaW5jZSBLREZzIHNob3VsZCBuZXZlciBmYWlsLiBZb3UgKm11c3QqIGZpeCB0aGUga2RmIGJlZm9yZQorICAgICAgICAgICAgLy8gcHJvY2VlZGluZyEKKyAgICAgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgICAgIFNMT0dXKAorICAgICAgICAgICAgICAgICAgICAiVXBncmFkZSBmYWlsZWQgd2l0aCBlcnJvciAlZCwiCisgICAgICAgICAgICAgICAgICAgICIgYnV0IGNvbnRpbnVpbmcgd2l0aCBwcmV2aW91cyBzdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK2Vycm91dDoKKyAgICBpZiAoaW50ZXJtZWRpYXRlX2tleSkgeworICAgICAgICBtZW1zZXQoaW50ZXJtZWRpYXRlX2tleSwgMCwgaW50ZXJtZWRpYXRlX2tleV9zaXplKTsKKyAgICAgICAgZnJlZShpbnRlcm1lZGlhdGVfa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOwogfQogCiAvKgpAQCAtMTg3MywxOSArMTgxNywxMCBAQAogICoKICAqIG91dF9jcnlwdG9fYmxrZGV2IG11c3QgYmUgTUFYUEFUSExFTi4KICAqLwotaW50IGNyeXB0ZnNfc2V0dXBfZXh0X3ZvbHVtZShjb25zdCBjaGFyKiBsYWJlbCwgY29uc3QgY2hhciogcmVhbF9ibGtkZXYsCi0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGtleSwgY2hhciogb3V0X2NyeXB0b19ibGtkZXYpIHsKLSAgICBpbnQgZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JET05MWXxPX0NMT0VYRUMpOwotICAgIGlmIChmZCA9PSAtMSkgewotICAgICAgICBTTE9HRSgiRmFpbGVkIHRvIG9wZW4gJXM6ICVzIiwgcmVhbF9ibGtkZXYsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBsb25nIG5yX3NlYyA9IDA7Ci0gICAgZ2V0X2Jsa2Rldl9zaXplKGZkLCAmbnJfc2VjKTsKLSAgICBjbG9zZShmZCk7Ci0KLSAgICBpZiAobnJfc2VjID09IDApIHsKK2ludCBjcnlwdGZzX3NldHVwX2V4dF92b2x1bWUoY29uc3QgY2hhciogbGFiZWwsIGNvbnN0IGNoYXIqIHJlYWxfYmxrZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG91dF9jcnlwdG9fYmxrZGV2KSB7CisgICAgdWludDY0X3QgbnJfc2VjID0gMDsKKyAgICBpZiAoYW5kcm9pZDo6dm9sZDo6R2V0QmxvY2tEZXY1MTJTZWN0b3JzKHJlYWxfYmxrZGV2LCAmbnJfc2VjKSAhPSBhbmRyb2lkOjpPSykgewogICAgICAgICBTTE9HRSgiRmFpbGVkIHRvIGdldCBzaXplIG9mICVzOiAlcyIsIHJlYWxfYmxrZGV2LCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTg5NCwxMCArMTgyOSwxMCBAQAogICAgIG1lbXNldCgmZXh0X2NyeXB0X2Z0ciwgMCwgc2l6ZW9mKGV4dF9jcnlwdF9mdHIpKTsKICAgICBleHRfY3J5cHRfZnRyLmZzX3NpemUgPSBucl9zZWM7CiAgICAgZXh0X2NyeXB0X2Z0ci5rZXlzaXplID0gY3J5cHRmc19nZXRfa2V5c2l6ZSgpOwotICAgIHN0cmxjcHkoKGNoYXIqKSBleHRfY3J5cHRfZnRyLmNyeXB0b190eXBlX25hbWUsIGNyeXB0ZnNfZ2V0X2NyeXB0b19uYW1lKCksCisgICAgc3RybGNweSgoY2hhciopZXh0X2NyeXB0X2Z0ci5jcnlwdG9fdHlwZV9uYW1lLCBjcnlwdGZzX2dldF9jcnlwdG9fbmFtZSgpLAogICAgICAgICAgICAgTUFYX0NSWVBUT19UWVBFX05BTUVfTEVOKTsKICAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkgJiYKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSAmJgogICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLmNyeXB0by5hbGxvd19lbmNyeXB0X292ZXJyaWRlIiwgZmFsc2UpKQogICAgICAgICBmbGFncyB8PSBDUkVBVEVfQ1JZUFRPX0JMS19ERVZfRkxBR1NfQUxMT1dfRU5DUllQVF9PVkVSUklERTsKIApAQCAtMTkwOSwyMSArMTg0NCwyMCBAQAogICogc3RvcmFnZSB2b2x1bWUuCiAgKi8KIGludCBjcnlwdGZzX3JldmVydF9leHRfdm9sdW1lKGNvbnN0IGNoYXIqIGxhYmVsKSB7Ci0gICAgcmV0dXJuIGRlbGV0ZV9jcnlwdG9fYmxrX2RldigoY2hhciopIGxhYmVsKTsKKyAgICByZXR1cm4gZGVsZXRlX2NyeXB0b19ibGtfZGV2KChjaGFyKilsYWJlbCk7CiB9CiAKLWludCBjcnlwdGZzX2NyeXB0b19jb21wbGV0ZSh2b2lkKQotewotICByZXR1cm4gZG9fY3J5cHRvX2NvbXBsZXRlKCIvZGF0YSIpOworaW50IGNyeXB0ZnNfY3J5cHRvX2NvbXBsZXRlKHZvaWQpIHsKKyAgICByZXR1cm4gZG9fY3J5cHRvX2NvbXBsZXRlKCIvZGF0YSIpOwogfQogCi1pbnQgY2hlY2tfdW5tb3VudGVkX2FuZF9nZXRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpCi17CitpbnQgY2hlY2tfdW5tb3VudGVkX2FuZF9nZXRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKICAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKCBtYXN0ZXJfa2V5X3NhdmVkIHx8IHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSApIHsKLSAgICAgICAgU0xPR0UoImVuY3J5cHRlZCBmcyBhbHJlYWR5IHZhbGlkYXRlZCBvciBub3QgcnVubmluZyB3aXRoIGVuY3J5cHRpb24sIgotICAgICAgICAgICAgICAiIGFib3J0aW5nIik7CisgICAgaWYgKG1hc3Rlcl9rZXlfc2F2ZWQgfHwgc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CisgICAgICAgIFNMT0dFKAorICAgICAgICAgICAgImVuY3J5cHRlZCBmcyBhbHJlYWR5IHZhbGlkYXRlZCBvciBub3QgcnVubmluZyB3aXRoIGVuY3J5cHRpb24sIgorICAgICAgICAgICAgIiBhYm9ydGluZyIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC0xOTM1LDEwICsxODY5LDkgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGNyeXB0ZnNfY2hlY2tfcGFzc3dkKGNvbnN0IGNoYXIgKnBhc3N3ZCkKLXsKK2ludCBjcnlwdGZzX2NoZWNrX3Bhc3N3ZChjb25zdCBjaGFyKiBwYXNzd2QpIHsKICAgICBTTE9HSSgiY3J5cHRmc19jaGVja19wYXNzd2QiKTsKLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJjcnlwdGZzX2NoZWNrX3Bhc3N3ZCBub3QgdmFsaWQgZm9yIGZpbGUgZW5jcnlwdGlvbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTk1Miw4ICsxODg1LDcgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAotICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgcGFzc3dkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9NTlRfUE9JTlQsIENSWVBUT19CTE9DS19ERVZJQ0UpOworICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgcGFzc3dkLCBEQVRBX01OVF9QT0lOVCwgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CiAgICAgaWYgKHJjKSB7CiAgICAgICAgIFNMT0dFKCJQYXNzd29yZCBkaWQgbm90IG1hdGNoIik7CiAgICAgICAgIHJldHVybiByYzsKQEAgLTE5NjUsOCArMTg5Nyw4IEBACiAgICAgICAgIC8vIEZpcnN0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgY3J5cHRvIGJsb2NrIGRldmljZSB0aGF0CiAgICAgICAgIC8vIHRlc3RfbW91bnRfZW5jcnlwdGVkX2ZzIGxlYXZlcyBiZWhpbmQgYXMgYSBzaWRlIGVmZmVjdAogICAgICAgICBkZWxldGVfY3J5cHRvX2Jsa19kZXYoQ1JZUFRPX0JMT0NLX0RFVklDRSk7Ci0gICAgICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgREVGQVVMVF9QQVNTV09SRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX01OVF9QT0lOVCwgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CisgICAgICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgREVGQVVMVF9QQVNTV09SRCwgREFUQV9NTlRfUE9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CiAgICAgICAgIGlmIChyYykgewogICAgICAgICAgICAgU0xPR0UoIkRlZmF1bHQgcGFzc3dvcmQgZGlkIG5vdCBtYXRjaCBvbiByZWJvb3QgZW5jcnlwdGlvbiIpOwogICAgICAgICAgICAgcmV0dXJuIHJjOwpAQCAtMTk5MiwxNSArMTkyNCwxNCBAQAogICAgIHJldHVybiByYzsKIH0KIAotaW50IGNyeXB0ZnNfdmVyaWZ5X3Bhc3N3ZChjb25zdCBjaGFyICpwYXNzd2QpCi17CitpbnQgY3J5cHRmc192ZXJpZnlfcGFzc3dkKGNvbnN0IGNoYXIqIHBhc3N3ZCkgewogICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKICAgICB1bnNpZ25lZCBjaGFyIGRlY3J5cHRlZF9tYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsKICAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGludCByYzsKIAogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSApIHsKKyAgICBpZiAoc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CiAgICAgICAgIFNMT0dFKCJkZXZpY2Ugbm90IGVuY3J5cHRlZCwgYWJvcnRpbmciKTsKICAgICAgICAgcmV0dXJuIC0yOwogICAgIH0KQEAgLTIwNDMsOCArMTk3NCw3IEBACiAgKiBQcmVzdW1hYmx5LCBhdCBhIG1pbmltdW0sIHRoZSBjYWxsZXIgd2lsbCB1cGRhdGUgdGhlCiAgKiBmaWxlc3lzdGVtIHNpemUgYW5kIGNyeXB0b190eXBlX25hbWUgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IGNyeXB0ZnNfaW5pdF9jcnlwdF9tbnRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIpCi17CitzdGF0aWMgaW50IGNyeXB0ZnNfaW5pdF9jcnlwdF9tbnRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIpIHsKICAgICBvZmY2NF90IG9mZjsKIAogICAgIG1lbXNldChmdHIsIDAsIHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpOwpAQCAtMjA1NSwxNyArMTk4NSwxNyBAQAogICAgIGZ0ci0+a2V5c2l6ZSA9IGNyeXB0ZnNfZ2V0X2tleXNpemUoKTsKIAogICAgIHN3aXRjaCAoa2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHkoKSkgewotICAgIGNhc2UgMToKLSAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIDA6Ci0gICAgICAgIGZ0ci0+a2RmX3R5cGUgPSBLREZfU0NSWVBUOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFQ7CisgICAgICAgICAgICBicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFNMT0dFKCJrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU0xPR0UoImtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5IGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIGdldF9kZXZpY2Vfc2NyeXB0X3BhcmFtcyhmdHIpOwpAQCAtMjA3Myw4ICsyMDAzLDcgQEAKICAgICBmdHItPnBlcnNpc3RfZGF0YV9zaXplID0gQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkU7CiAgICAgaWYgKGdldF9jcnlwdF9mdHJfaW5mbyhOVUxMLCAmb2ZmKSA9PSAwKSB7CiAgICAgICAgIGZ0ci0+cGVyc2lzdF9kYXRhX29mZnNldFswXSA9IG9mZiArIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVDsKLSAgICAgICAgZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdID0gb2ZmICsgQ1JZUFRfRk9PVEVSX1RPX1BFUlNJU1RfT0ZGU0VUICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ci0+cGVyc2lzdF9kYXRhX3NpemU7CisgICAgICAgIGZ0ci0+cGVyc2lzdF9kYXRhX29mZnNldFsxXSA9IG9mZiArIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVCArIGZ0ci0+cGVyc2lzdF9kYXRhX3NpemU7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0yMDgyLDkgKzIwMTEsOCBAQAogCiAjZGVmaW5lIEZSQU1FV09SS19CT09UX1dBSVQgNjAKIAotc3RhdGljIGludCBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY29uc3QgY2hhciogZmlsZW5hbWUsIF9fbGU4KiBidWYpCi17Ci0gICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFl8T19DTE9FWEVDKTsKK3N0YXRpYyBpbnQgY3J5cHRmc19TSEEyNTZfZmlsZWJsb2NrKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBfX2xlOCogYnVmKSB7CisgICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwogICAgIGlmIChmZCA9PSAtMSkgewogICAgICAgICBTTE9HRSgiRXJyb3Igb3BlbmluZyBmaWxlICVzIiwgZmlsZW5hbWUpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yMTEwLDcgKzIwMzgsNyBAQAogCiBzdGF0aWMgaW50IGNyeXB0ZnNfZW5hYmxlX2FsbF92b2x1bWVzKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIsIGNoYXIqIGNyeXB0b19ibGtkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHJlYWxfYmxrZGV2LCBpbnQgcHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0bykgewotICAgIG9mZjY0X3QgY3VyX2VuY3J5cHRpb25fZG9uZT0wLCB0b3RfZW5jcnlwdGlvbl9zaXplPTA7CisgICAgb2ZmNjRfdCBjdXJfZW5jcnlwdGlvbl9kb25lID0gMCwgdG90X2VuY3J5cHRpb25fc2l6ZSA9IDA7CiAgICAgaW50IHJjID0gLTE7CiAKICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgdXNlcmRhdGEgcGFydGl0aW9uLCBhbmQgYWRkIGluIHRoZSB2b2xkIHZvbHVtZXMgYmVsb3cgKi8KQEAgLTIxNDYsMTcgKzIwNzQsMTYgQEAKIGludCBjcnlwdGZzX2VuYWJsZV9pbnRlcm5hbChpbnQgY3J5cHRfdHlwZSwgY29uc3QgY2hhciogcGFzc3dkLCBpbnQgbm9fdWkpIHsKICAgICBjaGFyIGNyeXB0b19ibGtkZXZbTUFYUEFUSExFTl0sIHJlYWxfYmxrZGV2W01BWFBBVEhMRU5dOwogICAgIHVuc2lnbmVkIGNoYXIgZGVjcnlwdGVkX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwotICAgIGludCByYz0tMSwgaTsKKyAgICBpbnQgcmMgPSAtMSwgaTsKICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjcnlwdF9mdHI7Ci0gICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGE7CisgICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSogcGRhdGE7CiAgICAgY2hhciBlbmNyeXB0ZWRfc3RhdGVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBjaGFyIGxvY2tpZFszMl0gPSB7IDAgfTsKKyAgICBjaGFyIGxvY2tpZFszMl0gPSB7MH07CiAgICAgY2hhciBrZXlfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgaW50IG51bV92b2xzOwogICAgIG9mZjY0X3QgcHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0byA9IDA7CiAgICAgYm9vbCByZWJvb3RFbmNyeXB0aW9uID0gZmFsc2U7CiAgICAgYm9vbCBvbmx5Q3JlYXRlSGVhZGVyID0gZmFsc2U7Ci0gICAgaW50IGZkID0gLTE7CiAKICAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpID09IDApIHsKICAgICAgICAgaWYgKGNyeXB0X2Z0ci5mbGFncyAmIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MpIHsKQEAgLTIyMDAsMjUgKzIxMjcsMTcgQEAKICAgICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwgMCwgcmVhbF9ibGtkZXYsIHNpemVvZihyZWFsX2Jsa2RldikpOwogCiAgICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSByZWFsIGJsb2NrIGRldmljZSAqLwotICAgIGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRE9OTFl8T19DTE9FWEVDKTsKLSAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOwotICAgICAgICBnb3RvIGVycm9yX3VuZW5jcnlwdGVkOwotICAgIH0KLSAgICB1bnNpZ25lZCBsb25nIG5yX3NlYzsKLSAgICBnZXRfYmxrZGV2X3NpemUoZmQsICZucl9zZWMpOwotICAgIGlmIChucl9zZWMgPT0gMCkgeworICAgIHVpbnQ2NF90IG5yX3NlYzsKKyAgICBpZiAoYW5kcm9pZDo6dm9sZDo6R2V0QmxvY2tEZXY1MTJTZWN0b3JzKHJlYWxfYmxrZGV2LCAmbnJfc2VjKSAhPSBhbmRyb2lkOjpPSykgewogICAgICAgICBTTE9HRSgiQ2Fubm90IGdldCBzaXplIG9mIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOwogICAgICAgICBnb3RvIGVycm9yX3VuZW5jcnlwdGVkOwogICAgIH0KLSAgICBjbG9zZShmZCk7CiAKICAgICAvKiBJZiBkb2luZyBpbnBsYWNlIGVuY3J5cHRpb24sIG1ha2Ugc3VyZSB0aGUgb3JpZyBmcyBkb2Vzbid0IGluY2x1ZGUgdGhlIGNyeXB0byBmb290ZXIgKi8KICAgICBpZiAoIXN0cmNtcChrZXlfbG9jLCBLRVlfSU5fRk9PVEVSKSkgewotICAgICAgICB1bnNpZ25lZCBpbnQgZnNfc2l6ZV9zZWMsIG1heF9mc19zaXplX3NlYzsKKyAgICAgICAgdWludDY0X3QgZnNfc2l6ZV9zZWMsIG1heF9mc19zaXplX3NlYzsKICAgICAgICAgZnNfc2l6ZV9zZWMgPSBnZXRfZnNfc2l6ZShyZWFsX2Jsa2Rldik7Ci0gICAgICAgIGlmIChmc19zaXplX3NlYyA9PSAwKQotICAgICAgICAgICAgZnNfc2l6ZV9zZWMgPSBnZXRfZjJmc19maWxlc3lzdGVtX3NpemVfc2VjKHJlYWxfYmxrZGV2KTsKKyAgICAgICAgaWYgKGZzX3NpemVfc2VjID09IDApIGZzX3NpemVfc2VjID0gZ2V0X2YyZnNfZmlsZXN5c3RlbV9zaXplX3NlYyhyZWFsX2Jsa2Rldik7CiAKICAgICAgICAgbWF4X2ZzX3NpemVfc2VjID0gbnJfc2VjIC0gKENSWVBUX0ZPT1RFUl9PRkZTRVQgLyBDUllQVF9TRUNUT1JfU0laRSk7CiAKQEAgLTIyMzIsNyArMjE1MSw3IEBACiAgICAgICogZGV2aWNlIHRvIHNsZWVwIG9uIHVzLiAgV2UnbGwgZ3JhYiBhIHBhcnRpYWwgd2FrZWxvY2ssIGFuZCBpZiB0aGUgVUkKICAgICAgKiB3YW50cyB0byBrZWVwIHRoZSBzY3JlZW4gb24sIGl0IGNhbiBncmFiIGEgZnVsbCB3YWtlbG9jay4KICAgICAgKi8KLSAgICBzbnByaW50Zihsb2NraWQsIHNpemVvZihsb2NraWQpLCAiZW5hYmxlY3J5cHRvJWQiLCAoaW50KSBnZXRwaWQoKSk7CisgICAgc25wcmludGYobG9ja2lkLCBzaXplb2YobG9ja2lkKSwgImVuYWJsZWNyeXB0byVkIiwgKGludClnZXRwaWQoKSk7CiAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIGxvY2tpZCk7CiAKICAgICAvKiBUaGUgaW5pdCBmaWxlcyBhcmUgc2V0dXAgdG8gc3RvcCB0aGUgY2xhc3MgbWFpbiBhbmQgbGF0ZSBzdGFydCB3aGVuCkBAIC0yMjkyLDggKzIyMTEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFzdHJjbXAoa2V5X2xvYywgS0VZX0lOX0ZPT1RFUikpIHsKLSAgICAgICAgICAgIGNyeXB0X2Z0ci5mc19zaXplID0gbnJfc2VjCi0gICAgICAgICAgICAgIC0gKENSWVBUX0ZPT1RFUl9PRkZTRVQgLyBDUllQVF9TRUNUT1JfU0laRSk7CisgICAgICAgICAgICBjcnlwdF9mdHIuZnNfc2l6ZSA9IG5yX3NlYyAtIChDUllQVF9GT09URVJfT0ZGU0VUIC8gQ1JZUFRfU0VDVE9SX1NJWkUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY3J5cHRfZnRyLmZzX3NpemUgPSBucl9zZWM7CiAgICAgICAgIH0KQEAgLTIzMDcsNyArMjIyNSw4IEBACiAgICAgICAgICAgICBjcnlwdF9mdHIuZmxhZ3MgfD0gQ1JZUFRfSU5DT05TSVNURU5UX1NUQVRFOwogICAgICAgICB9CiAgICAgICAgIGNyeXB0X2Z0ci5jcnlwdF90eXBlID0gY3J5cHRfdHlwZTsKLSAgICAgICAgc3RybGNweSgoY2hhciAqKWNyeXB0X2Z0ci5jcnlwdG9fdHlwZV9uYW1lLCBjcnlwdGZzX2dldF9jcnlwdG9fbmFtZSgpLCBNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU4pOworICAgICAgICBzdHJsY3B5KChjaGFyKiljcnlwdF9mdHIuY3J5cHRvX3R5cGVfbmFtZSwgY3J5cHRmc19nZXRfY3J5cHRvX25hbWUoKSwKKyAgICAgICAgICAgICAgICBNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU4pOwogCiAgICAgICAgIC8qIE1ha2UgYW4gZW5jcnlwdGVkIG1hc3RlciBrZXkgKi8KICAgICAgICAgaWYgKGNyZWF0ZV9lbmNyeXB0ZWRfcmFuZG9tX2tleShvbmx5Q3JlYXRlSGVhZGVyID8gREVGQVVMVF9QQVNTV09SRCA6IHBhc3N3ZCwKQEAgLTIzMjEsOCArMjI0MCw4IEBACiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGZha2VfbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07CiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGVuY3J5cHRlZF9mYWtlX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwogICAgICAgICAgICAgbWVtc2V0KGZha2VfbWFzdGVyX2tleSwgMCwgc2l6ZW9mKGZha2VfbWFzdGVyX2tleSkpOwotICAgICAgICAgICAgZW5jcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgY3J5cHRfZnRyLnNhbHQsIGZha2VfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfZmFrZV9tYXN0ZXJfa2V5LCAmY3J5cHRfZnRyKTsKKyAgICAgICAgICAgIGVuY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIGNyeXB0X2Z0ci5zYWx0LCBmYWtlX21hc3Rlcl9rZXksIGVuY3J5cHRlZF9mYWtlX21hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyeXB0X2Z0cik7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBXcml0ZSB0aGUga2V5IHRvIHRoZSBlbmQgb2YgdGhlIHBhcnRpdGlvbiAqLwpAQCAtMjMzMiwxMSArMjI1MSwxMSBAQAogICAgICAgICAgKiBJZiBub25lLCBjcmVhdGUgYSB2YWxpZCBlbXB0eSB0YWJsZSBhbmQgc2F2ZSB0aGF0LgogICAgICAgICAgKi8KICAgICAgICAgaWYgKCFwZXJzaXN0X2RhdGEpIHsKLSAgICAgICAgICAgIHBkYXRhID0gKGNyeXB0X3BlcnNpc3RfZGF0YSAqKW1hbGxvYyhDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7Ci0gICAgICAgICAgIGlmIChwZGF0YSkgewotICAgICAgICAgICAgICAgaW5pdF9lbXB0eV9wZXJzaXN0X2RhdGEocGRhdGEsIENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKLSAgICAgICAgICAgICAgIHBlcnNpc3RfZGF0YSA9IHBkYXRhOwotICAgICAgICAgICB9CisgICAgICAgICAgICBwZGF0YSA9IChjcnlwdF9wZXJzaXN0X2RhdGEqKW1hbGxvYyhDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7CisgICAgICAgICAgICBpZiAocGRhdGEpIHsKKyAgICAgICAgICAgICAgICBpbml0X2VtcHR5X3BlcnNpc3RfZGF0YShwZGF0YSwgQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOworICAgICAgICAgICAgICAgIHBlcnNpc3RfZGF0YSA9IHBkYXRhOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChwZXJzaXN0X2RhdGEpIHsKICAgICAgICAgICAgIHNhdmVfcGVyc2lzdGVudF9kYXRhKCk7CkBAIC0yMzcwLDggKzIyODksOCBAQAogICAgICAgICBfX2xlOCBoYXNoX2ZpcnN0X2Jsb2NrW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKICAgICAgICAgcmMgPSBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY3J5cHRvX2Jsa2RldiwgaGFzaF9maXJzdF9ibG9jayk7CiAKLSAgICAgICAgaWYgKCFyYyAmJiBtZW1jbXAoaGFzaF9maXJzdF9ibG9jaywgY3J5cHRfZnRyLmhhc2hfZmlyc3RfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYXNoX2ZpcnN0X2Jsb2NrKSkgIT0gMCkgeworICAgICAgICBpZiAoIXJjICYmCisgICAgICAgICAgICBtZW1jbXAoaGFzaF9maXJzdF9ibG9jaywgY3J5cHRfZnRyLmhhc2hfZmlyc3RfYmxvY2ssIHNpemVvZihoYXNoX2ZpcnN0X2Jsb2NrKSkgIT0gMCkgewogICAgICAgICAgICAgU0xPR0UoIkNoZWNrc3VtcyBkbyBub3QgbWF0Y2ggLSB0cmlnZ2VyIHdpcGUiKTsKICAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgIH0KQEAgLTIzODQsOCArMjMwMyw3IEBACiAKICAgICAvKiBDYWxjdWxhdGUgY2hlY2tzdW0gaWYgd2UgYXJlIG5vdCBmaW5pc2hlZCAqLwogICAgIGlmICghcmMgJiYgY3J5cHRfZnRyLmVuY3J5cHRlZF91cHRvICE9IGNyeXB0X2Z0ci5mc19zaXplKSB7Ci0gICAgICAgIHJjID0gY3J5cHRmc19TSEEyNTZfZmlsZWJsb2NrKGNyeXB0b19ibGtkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci5oYXNoX2ZpcnN0X2Jsb2NrKTsKKyAgICAgICAgcmMgPSBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY3J5cHRvX2Jsa2RldiwgY3J5cHRfZnRyLmhhc2hfZmlyc3RfYmxvY2spOwogICAgICAgICBpZiAocmMpIHsKICAgICAgICAgICAgIFNMT0dFKCJFcnJvciBjYWxjdWxhdGluZyBjaGVja3N1bSBmb3IgY29udGludWluZyBlbmNyeXB0aW9uIik7CiAgICAgICAgICAgICByYyA9IC0xOwpAQCAtMjM5NSw3ICsyMzEzLDcgQEAKICAgICAvKiBVbmRvIHRoZSBkbS1jcnlwdCBtYXBwaW5nIHdoZXRoZXIgd2Ugc3VjY2VlZCBvciBub3QgKi8KICAgICBkZWxldGVfY3J5cHRvX2Jsa19kZXYoQ1JZUFRPX0JMT0NLX0RFVklDRSk7CiAKLSAgICBpZiAoISByYykgeworICAgIGlmICghcmMpIHsKICAgICAgICAgLyogU3VjY2VzcyAqLwogICAgICAgICBjcnlwdF9mdHIuZmxhZ3MgJj0gfkNSWVBUX0lOQ09OU0lTVEVOVF9TVEFURTsKIApAQCAtMjQ0Myw4ICsyMzYxLDcgQEAKICAgICAgICAgICAgIFNMT0dFKCJlbmNyeXB0aW9uIGZhaWxlZCAtIHJlYm9vdGluZyBpbnRvIHJlY292ZXJ5IHRvIHdpcGUgZGF0YVxuIik7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI7CiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3B0aW9ucyA9IHsKLSAgICAgICAgICAgICAgICAiLS13aXBlX2RhdGFcbi0tcmVhc29uPWNyeXB0ZnNfZW5hYmxlX2ludGVybmFsXG4iCi0gICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICItLXdpcGVfZGF0YVxuLS1yZWFzb249Y3J5cHRmc19lbmFibGVfaW50ZXJuYWxcbiJ9OwogICAgICAgICAgICAgaWYgKCF3cml0ZV9ib290bG9hZGVyX21lc3NhZ2Uob3B0aW9ucywgJmVycikpIHsKICAgICAgICAgICAgICAgICBTTE9HRSgiY291bGQgbm90IHdyaXRlIGJvb3Rsb2FkZXIgbWVzc2FnZTogJXMiLCBlcnIuY19zdHIoKSk7CiAgICAgICAgICAgICB9CkBAIC0yNDc3LDcgKzIzOTQsOSBAQAogICAgICAqIGJ1dCB0aGUgZnJhbWV3b3JrIGlzIHN0b3BwZWQgYW5kIG5vdCByZXN0YXJ0ZWQgdG8gc2hvdyB0aGUgZXJyb3IsIHNvIGl0J3MgdXAgdG8KICAgICAgKiB2b2xkIHRvIHJlc3RhcnQgdGhlIHN5c3RlbS4KICAgICAgKi8KLSAgICBTTE9HRSgiRXJyb3IgZW5hYmxpbmcgZW5jcnlwdGlvbiBhZnRlciBmcmFtZXdvcmsgaXMgc2h1dGRvd24sIG5vIGRhdGEgY2hhbmdlZCwgcmVzdGFydGluZyBzeXN0ZW0iKTsKKyAgICBTTE9HRSgKKyAgICAgICAgIkVycm9yIGVuYWJsaW5nIGVuY3J5cHRpb24gYWZ0ZXIgZnJhbWV3b3JrIGlzIHNodXRkb3duLCBubyBkYXRhIGNoYW5nZWQsIHJlc3RhcnRpbmcgIgorICAgICAgICAic3lzdGVtIik7CiAgICAgY3J5cHRmc19yZWJvb3QoUmVib290VHlwZTo6cmVib290KTsKIAogICAgIC8qIHNob3VsZG4ndCBnZXQgaGVyZSAqLwpAQCAtMjQ5Niw5ICsyNDE1LDggQEAKICAgICByZXR1cm4gY3J5cHRmc19lbmFibGVfaW50ZXJuYWwoQ1JZUFRfVFlQRV9ERUZBVUxULCBERUZBVUxUX1BBU1NXT1JELCBub191aSk7CiB9CiAKLWludCBjcnlwdGZzX2NoYW5nZXB3KGludCBjcnlwdF90eXBlLCBjb25zdCBjaGFyICpuZXdwdykKLXsKLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworaW50IGNyeXB0ZnNfY2hhbmdlcHcoaW50IGNyeXB0X3R5cGUsIGNvbnN0IGNoYXIqIG5ld3B3KSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoImNyeXB0ZnNfY2hhbmdlcHcgbm90IHZhbGlkIGZvciBmaWxlIGVuY3J5cHRpb24iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTI1MjUsMTIgKzI0NDMsOCBAQAogCiAgICAgY3J5cHRfZnRyLmNyeXB0X3R5cGUgPSBjcnlwdF90eXBlOwogCi0gICAgcmMgPSBlbmNyeXB0X21hc3Rlcl9rZXkoY3J5cHRfdHlwZSA9PSBDUllQVF9UWVBFX0RFRkFVTFQgPyBERUZBVUxUX1BBU1NXT1JECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3cHcsCi0gICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci5zYWx0LAotICAgICAgICAgICAgICAgICAgICAgICBzYXZlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHIubWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgJmNyeXB0X2Z0cik7CisgICAgcmMgPSBlbmNyeXB0X21hc3Rlcl9rZXkoY3J5cHRfdHlwZSA9PSBDUllQVF9UWVBFX0RFRkFVTFQgPyBERUZBVUxUX1BBU1NXT1JEIDogbmV3cHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLnNhbHQsIHNhdmVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ci5tYXN0ZXJfa2V5LCAmY3J5cHRfZnRyKTsKICAgICBpZiAocmMpIHsKICAgICAgICAgU0xPR0UoIkVuY3J5cHQgbWFzdGVyIGtleSBmYWlsZWQ6ICVkIiwgcmMpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yNTU4LDE0ICsyNDcyLDEzIEBACiAgICAgICAgIGRzaXplID0gQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkU7CiAgICAgfQogCi0gICAgbWF4X3BlcnNpc3RlbnRfZW50cmllcyA9IChkc2l6ZSAtIHNpemVvZihzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhKSkgLwotICAgICAgICBzaXplb2Yoc3RydWN0IGNyeXB0X3BlcnNpc3RfZW50cnkpOworICAgIG1heF9wZXJzaXN0ZW50X2VudHJpZXMgPQorICAgICAgICAoZHNpemUgLSBzaXplb2Yoc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSkpIC8gc2l6ZW9mKHN0cnVjdCBjcnlwdF9wZXJzaXN0X2VudHJ5KTsKIAogICAgIHJldHVybiBtYXhfcGVyc2lzdGVudF9lbnRyaWVzOwogfQogCi1zdGF0aWMgaW50IHBlcnNpc3RfZ2V0X2tleShjb25zdCBjaGFyICpmaWVsZG5hbWUsIGNoYXIgKnZhbHVlKQoteworc3RhdGljIGludCBwZXJzaXN0X2dldF9rZXkoY29uc3QgY2hhciogZmllbGRuYW1lLCBjaGFyKiB2YWx1ZSkgewogICAgIHVuc2lnbmVkIGludCBpOwogCiAgICAgaWYgKHBlcnNpc3RfZGF0YSA9PSBOVUxMKSB7CkBAIC0yNTgyLDggKzI0OTUsNyBAQAogICAgIHJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBwZXJzaXN0X3NldF9rZXkoY29uc3QgY2hhciAqZmllbGRuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IGVuY3J5cHRlZCkKLXsKK3N0YXRpYyBpbnQgcGVyc2lzdF9zZXRfa2V5KGNvbnN0IGNoYXIqIGZpZWxkbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIGludCBlbmNyeXB0ZWQpIHsKICAgICB1bnNpZ25lZCBpbnQgaTsKICAgICB1bnNpZ25lZCBpbnQgbnVtOwogICAgIHVuc2lnbmVkIGludCBtYXhfcGVyc2lzdGVudF9lbnRyaWVzOwpAQCAtMjYyMSw3ICsyNTMzLDcgQEAKICAqIFRlc3QgaWYga2V5IGlzIHBhcnQgb2YgdGhlIG11bHRpLWVudHJ5IChmaWVsZCwgaW5kZXgpIHNlcXVlbmNlLiBSZXR1cm4gbm9uLXplcm8gaWYga2V5IGlzIGluIHRoZQogICogc2VxdWVuY2UgYW5kIGl0cyBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gaW5kZXguIFJldHVybiAwIG90aGVyd2lzZS4KICAqLwotaW50IG1hdGNoX211bHRpX2VudHJ5KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqZmllbGQsIHVuc2lnbmVkIGluZGV4KSB7CitpbnQgbWF0Y2hfbXVsdGlfZW50cnkoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiBmaWVsZCwgdW5zaWduZWQgaW5kZXgpIHsKICAgICBzdGQ6OnN0cmluZyBrZXlfID0ga2V5OwogICAgIHN0ZDo6c3RyaW5nIGZpZWxkXyA9IGZpZWxkOwogCkBAIC0yNjQ4LDggKzI1NjAsNyBAQAogICogYW5kIFBFUlNJU1RfREVMX0tFWV9FUlJPUl9PVEhFUiBpZiBlcnJvciBvY2N1cnMuCiAgKgogICovCi1zdGF0aWMgaW50IHBlcnNpc3RfZGVsX2tleXMoY29uc3QgY2hhciAqZmllbGRuYW1lLCB1bnNpZ25lZCBpbmRleCkKLXsKK3N0YXRpYyBpbnQgcGVyc2lzdF9kZWxfa2V5cyhjb25zdCBjaGFyKiBmaWVsZG5hbWUsIHVuc2lnbmVkIGluZGV4KSB7CiAgICAgdW5zaWduZWQgaW50IGk7CiAgICAgdW5zaWduZWQgaW50IGo7CiAgICAgdW5zaWduZWQgaW50IG51bTsKQEAgLTI2NjAsNyArMjU3MSw3IEBACiAKICAgICBudW0gPSBwZXJzaXN0X2RhdGEtPnBlcnNpc3RfdmFsaWRfZW50cmllczsKIAotICAgIGogPSAwOyAvLyBwb2ludHMgdG8gdGhlIGVuZCBvZiBub24tZGVsZXRlZCBlbnRyaWVzLgorICAgIGogPSAwOyAgLy8gcG9pbnRzIHRvIHRoZSBlbmQgb2Ygbm9uLWRlbGV0ZWQgZW50cmllcy4KICAgICAvLyBGaWx0ZXIgb3V0IHRvLWJlLWRlbGV0ZWQgZW50cmllcyBpbiBwbGFjZS4KICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKICAgICAgICAgaWYgKCFtYXRjaF9tdWx0aV9lbnRyeShwZXJzaXN0X2RhdGEtPnBlcnNpc3RfZW50cnlbaV0ua2V5LCBmaWVsZG5hbWUsIGluZGV4KSkgewpAQCAtMjY4MCw4ICsyNTkxLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgcGVyc2lzdF9jb3VudF9rZXlzKGNvbnN0IGNoYXIgKmZpZWxkbmFtZSkKLXsKK3N0YXRpYyBpbnQgcGVyc2lzdF9jb3VudF9rZXlzKGNvbnN0IGNoYXIqIGZpZWxkbmFtZSkgewogICAgIHVuc2lnbmVkIGludCBpOwogICAgIHVuc2lnbmVkIGludCBjb3VudDsKIApAQCAtMjcwMCw5ICsyNjEwLDggQEAKIH0KIAogLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLiAqLwotaW50IGNyeXB0ZnNfZ2V0ZmllbGQoY29uc3QgY2hhciAqZmllbGRuYW1lLCBjaGFyICp2YWx1ZSwgaW50IGxlbikKLXsKLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworaW50IGNyeXB0ZnNfZ2V0ZmllbGQoY29uc3QgY2hhciogZmllbGRuYW1lLCBjaGFyKiB2YWx1ZSwgaW50IGxlbikgeworICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJDYW5ub3QgZ2V0IGZpZWxkIHdoZW4gZmlsZSBlbmNyeXB0ZWQiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTI3MjksNyArMjYzOCw3IEBACiAgICAgLy8gc3RpdGNoIHRoZW0gYmFjayB0b2dldGhlci4KICAgICBpZiAoIXBlcnNpc3RfZ2V0X2tleShmaWVsZG5hbWUsIHRlbXBfdmFsdWUpKSB7CiAgICAgICAgIC8vIFdlIGZvdW5kIGl0LCBjb3B5IGl0IHRvIHRoZSBjYWxsZXIncyBidWZmZXIgYW5kIGtlZXAgZ29pbmcgdW50aWwgYWxsIGVudHJpZXMgYXJlIHJlYWQuCi0gICAgICAgIGlmIChzdHJsY3B5KHZhbHVlLCB0ZW1wX3ZhbHVlLCBsZW4pID49ICh1bnNpZ25lZCkgbGVuKSB7CisgICAgICAgIGlmIChzdHJsY3B5KHZhbHVlLCB0ZW1wX3ZhbHVlLCBsZW4pID49ICh1bnNpZ25lZClsZW4pIHsKICAgICAgICAgICAgIC8vIHZhbHVlIHRvbyBzbWFsbAogICAgICAgICAgICAgcmMgPSBDUllQVE9fR0VURklFTERfRVJST1JfQlVGX1RPT19TTUFMTDsKICAgICAgICAgICAgIGdvdG8gb3V0OwpAQCAtMjczOCw3ICsyNjQ3LDcgQEAKIAogICAgICAgICBmb3IgKGkgPSAxOyAvKiBicmVhayBleHBsaWNpdGx5ICovOyBpKyspIHsKICAgICAgICAgICAgIGlmIChzbnByaW50Zih0ZW1wX2ZpZWxkLCBzaXplb2YodGVtcF9maWVsZCksICIlc18lZCIsIGZpZWxkbmFtZSwgaSkgPj0KLSAgICAgICAgICAgICAgICAgICAgKGludCkgc2l6ZW9mKHRlbXBfZmllbGQpKSB7CisgICAgICAgICAgICAgICAgKGludClzaXplb2YodGVtcF9maWVsZCkpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZmllbGRuYW1lIGlzIHZlcnkgbG9uZywgd2Ugc3RvcCBhcyBzb29uIGFzIGl0IGJlZ2lucyB0byBvdmVyZmxvdyB0aGUKICAgICAgICAgICAgICAgICAvLyBtYXhpbXVtIGZpZWxkIGxlbmd0aC4gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGluIGZhY3QgZnVsbHkgcmVhZCBvdXQgdGhlIG9yaWdpbmFsCiAgICAgICAgICAgICAgICAgLy8gdmFsdWUgYmVjYXVzZSBjcnlwdGZzX3NldGZpZWxkIHdvdWxkIG5vdCBhbGxvdyBmaWVsZHMgd2l0aCBsb25nZXIgbmFtZXMgdG8gYmUKQEAgLTI3NDYsMTEgKzI2NTUsMTEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghcGVyc2lzdF9nZXRfa2V5KHRlbXBfZmllbGQsIHRlbXBfdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoc3RybGNhdCh2YWx1ZSwgdGVtcF92YWx1ZSwgbGVuKSA+PSAodW5zaWduZWQpbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdG9vIHNtYWxsLgotICAgICAgICAgICAgICAgICAgICAgIHJjID0gQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX0JVRl9UT09fU01BTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0cmxjYXQodmFsdWUsIHRlbXBfdmFsdWUsIGxlbikgPj0gKHVuc2lnbmVkKWxlbikgeworICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSB0b28gc21hbGwuCisgICAgICAgICAgICAgICAgICAgIHJjID0gQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX0JVRl9UT09fU01BTEw7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gRXhoYXVzdCBhbGwgZW50cmllcy4KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI3NjYsOSArMjY3NSw4IEBACiB9CiAKIC8qIFNldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4gKi8KLWludCBjcnlwdGZzX3NldGZpZWxkKGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKK2ludCBjcnlwdGZzX3NldGZpZWxkKGNvbnN0IGNoYXIqIGZpZWxkbmFtZSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICBTTE9HRSgiQ2Fubm90IHNldCBmaWVsZCB3aGVuIGZpbGUgZW5jcnlwdGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0yNzkxLDcgKzI2OTksNyBAQAogICAgIH0KIAogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKCFzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikgKSB7CisgICAgaWYgKCFzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikpIHsKICAgICAgICAgZW5jcnlwdGVkID0gMTsKICAgICB9CiAKQEAgLTI4NjAsMTQgKzI3NjgsMTQgQEAKICAqIE9uIHN1Y2Nlc3MgdHJpZ2dlciBuZXh0IGluaXQgcGhhc2UgYW5kIHJldHVybiAwLgogICogQ3VycmVudGx5IGRvIG5vdCBoYW5kbGUgZmFpbHVyZSAtIHNlZSBUT0RPIGJlbG93LgogICovCi1pbnQgY3J5cHRmc19tb3VudF9kZWZhdWx0X2VuY3J5cHRlZCh2b2lkKQoteworaW50IGNyeXB0ZnNfbW91bnRfZGVmYXVsdF9lbmNyeXB0ZWQodm9pZCkgewogICAgIGludCBjcnlwdF90eXBlID0gY3J5cHRmc19nZXRfcGFzc3dvcmRfdHlwZSgpOwogICAgIGlmIChjcnlwdF90eXBlIDwgMCB8fCBjcnlwdF90eXBlID4gQ1JZUFRfVFlQRV9NQVhfVFlQRSkgewogICAgICAgICBTTE9HRSgiQmFkIGNyeXB0IHR5cGUgLSBlcnJvciIpOwogICAgIH0gZWxzZSBpZiAoY3J5cHRfdHlwZSAhPSBDUllQVF9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgU0xPR0QoIlBhc3N3b3JkIGlzIG5vdCBkZWZhdWx0IC0gIgotICAgICAgICAgICAgICAic3RhcnRpbmcgbWluIGZyYW1ld29yayB0byBwcm9tcHQiKTsKKyAgICAgICAgU0xPR0QoCisgICAgICAgICAgICAiUGFzc3dvcmQgaXMgbm90IGRlZmF1bHQgLSAiCisgICAgICAgICAgICAic3RhcnRpbmcgbWluIGZyYW1ld29yayB0byBwcm9tcHQiKTsKICAgICAgICAgcHJvcGVydHlfc2V0KCJ2b2xkLmRlY3J5cHQiLCAidHJpZ2dlcl9yZXN0YXJ0X21pbl9mcmFtZXdvcmsiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIGlmIChjcnlwdGZzX2NoZWNrX3Bhc3N3ZChERUZBVUxUX1BBU1NXT1JEKSA9PSAwKSB7CkBAIC0yODg3LDkgKzI3OTUsOCBAQAogCiAvKiBSZXR1cm5zIHR5cGUgb2YgdGhlIHBhc3N3b3JkLCBkZWZhdWx0LCBwYXR0ZXJuLCBwaW4gb3IgcGFzc3dvcmQuCiAgKi8KLWludCBjcnlwdGZzX2dldF9wYXNzd29yZF90eXBlKHZvaWQpCi17Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKK2ludCBjcnlwdGZzX2dldF9wYXNzd29yZF90eXBlKHZvaWQpIHsKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICBTTE9HRSgiY3J5cHRmc19nZXRfcGFzc3dvcmRfdHlwZSBub3QgdmFsaWQgZm9yIGZpbGUgZW5jcnlwdGlvbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMjkwOCw5ICsyODE1LDggQEAKICAgICByZXR1cm4gY3J5cHRfZnRyLmNyeXB0X3R5cGU7CiB9CiAKLWNvbnN0IGNoYXIqIGNyeXB0ZnNfZ2V0X3Bhc3N3b3JkKCkKLXsKLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworY29uc3QgY2hhciogY3J5cHRmc19nZXRfcGFzc3dvcmQoKSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoImNyeXB0ZnNfZ2V0X3Bhc3N3b3JkIG5vdCB2YWxpZCBmb3IgZmlsZSBlbmNyeXB0aW9uIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTI5MjUsOCArMjgzMSw3IEBACiAgICAgfQogfQogCi12b2lkIGNyeXB0ZnNfY2xlYXJfcGFzc3dvcmQoKQotewordm9pZCBjcnlwdGZzX2NsZWFyX3Bhc3N3b3JkKCkgewogICAgIGlmIChwYXNzd29yZCkgewogICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKHBhc3N3b3JkKTsKICAgICAgICAgbWVtc2V0KHBhc3N3b3JkLCAwLCBsZW4pOwpAQCAtMjkzNiw4ICsyODQxLDcgQEAKICAgICB9CiB9CiAKLWludCBjcnlwdGZzX2lzQ29udmVydGlibGVUb0ZCRSgpCi17CitpbnQgY3J5cHRmc19pc0NvbnZlcnRpYmxlVG9GQkUoKSB7CiAgICAgc3RydWN0IGZzdGFiX3JlYyogcmVjID0gZnNfbWdyX2dldF9lbnRyeV9mb3JfbW91bnRfcG9pbnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQpOwotICAgIHJldHVybiBmc19tZ3JfaXNfY29udmVydGlibGVfdG9fZmJlKHJlYykgPyAxIDogMDsKKyAgICByZXR1cm4gKHJlYyAmJiBmc19tZ3JfaXNfY29udmVydGlibGVfdG9fZmJlKHJlYykpID8gMSA6IDA7CiB9CmRpZmYgLS1naXQgYS9jcnlwdGZzLmggYi9jcnlwdGZzLmgKaW5kZXggZDZjN2RjNS4uNjkyZDdlZSAxMDA2NDQKLS0tIGEvY3J5cHRmcy5oCisrKyBiL2NyeXB0ZnMuaApAQCAtMjksOCArMjksMTAgQEAKICAqIHBhcnRpdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CisKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAvKiBUaGUgY3VycmVudCBjcnlwdGZzIHZlcnNpb24gKi8KQEAgLTQ5LDMyICs1MSwzOSBAQAogCiAvKiBkZWZpbml0aW9ucyBvZiBmbGFncyBpbiB0aGUgc3RydWN0dXJlIGJlbG93ICovCiAjZGVmaW5lIENSWVBUX01OVF9LRVlfVU5FTkNSWVBURUQgMHgxIC8qIFRoZSBrZXkgZm9yIHRoZSBwYXJ0aXRpb24gaXMgbm90IGVuY3J5cHRlZC4gKi8KLSNkZWZpbmUgQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUyAweDIgLyogRW5jcnlwdGlvbiBwYXJ0aWFsbHkgY29tcGxldGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfdXB0byB2YWxpZCovCi0jZGVmaW5lIENSWVBUX0lOQ09OU0lTVEVOVF9TVEFURSAweDQgLyogU2V0IHdoZW4gc3RhcnRpbmcgZW5jcnlwdGlvbiwgY2xlYXIgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgY2xlYW5seSwgZWl0aGVyIHRocm91Z2ggc3VjY2VzcyBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RseSBtYXJrZWQgcGFydGlhbCBlbmNyeXB0aW9uICovCi0jZGVmaW5lIENSWVBUX0RBVEFfQ09SUlVQVCAweDggLyogU2V0IHdoZW4gZW5jcnlwdGlvbiBpcyBmaW5lLCBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJseWluZyB2b2x1bWUgaXMgY29ycnVwdCAqLwotI2RlZmluZSBDUllQVF9GT1JDRV9FTkNSWVBUSU9OIDB4MTAgLyogU2V0IHdoZW4gaXQgaXMgdGltZSB0byBlbmNyeXB0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSBvbiBib290LiBFdmVyeXRoaW5nIGluIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBpcyBzZXQgdXAgY29ycmVjdGx5IGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aG91Z2ggZGV2aWNlIGlzIGVuY3J5cHRlZCBleGNlcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIG1hc3RlciBrZXkgaXMgZW5jcnlwdGVkIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHBhc3N3b3JkLiAqLwotI2RlZmluZSBDUllQVF9GT1JDRV9DT01QTEVURSAweDIwIC8qIFNldCB3aGVuIHRoZSBhYm92ZSBlbmNyeXB0aW9uIGN5Y2xlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUuIE9uIG5leHQgY3J5cHRrZWVwZXIgZW50cnksIG1hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhc3N3b3JkLiBJZiBpdCBtYXRjaGVzIGZpeCB0aGUgbWFzdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5IGFuZCByZW1vdmUgdGhpcyBmbGFnLiAqLworI2RlZmluZSBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTICAgICAgIFwKKyAgICAweDIgLyogRW5jcnlwdGlvbiBwYXJ0aWFsbHkgY29tcGxldGVkLCBcCisgICAgICAgICAgIGVuY3J5cHRlZF91cHRvIHZhbGlkKi8KKyNkZWZpbmUgQ1JZUFRfSU5DT05TSVNURU5UX1NUQVRFICAgICAgICAgICAgICAgICAgICBcCisgICAgMHg0IC8qIFNldCB3aGVuIHN0YXJ0aW5nIGVuY3J5cHRpb24sIGNsZWFyIHdoZW4gXAorICAgICAgICAgICBleGl0IGNsZWFubHksIGVpdGhlciB0aHJvdWdoIHN1Y2Nlc3Mgb3IgIFwKKyAgICAgICAgICAgY29ycmVjdGx5IG1hcmtlZCBwYXJ0aWFsIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUgQ1JZUFRfREFUQV9DT1JSVVBUICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAweDggLyogU2V0IHdoZW4gZW5jcnlwdGlvbiBpcyBmaW5lLCBidXQgdGhlIFwKKyAgICAgICAgICAgdW5kZXJseWluZyB2b2x1bWUgaXMgY29ycnVwdCAqLworI2RlZmluZSBDUllQVF9GT1JDRV9FTkNSWVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDB4MTAgLyogU2V0IHdoZW4gaXQgaXMgdGltZSB0byBlbmNyeXB0IHRoaXMgICAgICAgXAorICAgICAgICAgICAgdm9sdW1lIG9uIGJvb3QuIEV2ZXJ5dGhpbmcgaW4gdGhpcyAgICAgICAgXAorICAgICAgICAgICAgc3RydWN0dXJlIGlzIHNldCB1cCBjb3JyZWN0bHkgYXMgICAgICAgICAgXAorICAgICAgICAgICAgdGhvdWdoIGRldmljZSBpcyBlbmNyeXB0ZWQgZXhjZXB0ICAgICAgICAgXAorICAgICAgICAgICAgdGhhdCB0aGUgbWFzdGVyIGtleSBpcyBlbmNyeXB0ZWQgd2l0aCB0aGUgXAorICAgICAgICAgICAgZGVmYXVsdCBwYXNzd29yZC4gKi8KKyNkZWZpbmUgQ1JZUFRfRk9SQ0VfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgMHgyMCAvKiBTZXQgd2hlbiB0aGUgYWJvdmUgZW5jcnlwdGlvbiBjeWNsZSBpcyAgICAgXAorICAgICAgICAgICAgY29tcGxldGUuIE9uIG5leHQgY3J5cHRrZWVwZXIgZW50cnksIG1hdGNoIFwKKyAgICAgICAgICAgIHRoZSBwYXNzd29yZC4gSWYgaXQgbWF0Y2hlcyBmaXggdGhlIG1hc3RlciBcCisgICAgICAgICAgICBrZXkgYW5kIHJlbW92ZSB0aGlzIGZsYWcuICovCiAKIC8qIEFsbG93ZWQgdmFsdWVzIGZvciB0eXBlIGluIHRoZSBzdHJ1Y3R1cmUgYmVsb3cgKi8KLSNkZWZpbmUgQ1JZUFRfVFlQRV9QQVNTV09SRCAwIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggYSBwYXNzd29yZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTXVzdCBiZSB6ZXJvIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBwcmUtTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGV2aWNlcyB3aGVyZSB0eXBlIGlzIGFsd2F5cyBwYXNzd29yZC4qLwotI2RlZmluZSBDUllQVF9UWVBFX0RFRkFVTFQgIDEgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYXNzd29yZCAqLwotI2RlZmluZSBDUllQVF9UWVBFX1BBVFRFUk4gIDIgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBhdHRlcm4gKi8KLSNkZWZpbmUgQ1JZUFRfVFlQRV9QSU4gICAgICAzIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggYSBwaW4gKi8KKyNkZWZpbmUgQ1JZUFRfVFlQRV9QQVNTV09SRCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDAgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBhc3N3b3JkICBcCisgICAgICAgKiBNdXN0IGJlIHplcm8gdG8gYmUgY29tcGF0aWJsZSB3aXRoIHByZS1MIFwKKyAgICAgICAqIGRldmljZXMgd2hlcmUgdHlwZSBpcyBhbHdheXMgcGFzc3dvcmQuKi8KKyNkZWZpbmUgQ1JZUFRfVFlQRV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAxICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBkZWZhdWx0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzc3dvcmQgKi8KKyNkZWZpbmUgQ1JZUFRfVFlQRV9QQVRURVJOIDIgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBhdHRlcm4gKi8KKyNkZWZpbmUgQ1JZUFRfVFlQRV9QSU4gMyAgICAgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBpbiAqLwogI2RlZmluZSBDUllQVF9UWVBFX01BWF9UWVBFIDMgLyogdHlwZSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSAqLwogCiAjZGVmaW5lIENSWVBUX01OVF9NQUdJQyAweEQwQjVCMUM0CkBAIC05MCw3OCArOTksNzggQEAKICNkZWZpbmUgS0VZTUFTVEVSX0JMT0JfU0laRSAyMDQ4CiAKIC8qIF9fbGUzMiBhbmQgX19sZTE2IGRlZmluZWQgaW4gc3lzdGVtL2V4dHJhcy9leHQ0X3V0aWxzL2V4dDRfdXRpbHMuaCAqLwotI2RlZmluZSBfX2xlOCAgdW5zaWduZWQgY2hhcgorI2RlZmluZSBfX2xlOCB1bnNpZ25lZCBjaGFyCiAKICNpZiAhZGVmaW5lZChTSEEyNTZfRElHRVNUX0xFTkdUSCkKICNkZWZpbmUgU0hBMjU2X0RJR0VTVF9MRU5HVEggMzIKICNlbmRpZgogCiBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciB7Ci0gIF9fbGUzMiBtYWdpYzsgICAgICAgICAvKiBTZWUgYWJvdmUgKi8KLSAgX19sZTE2IG1ham9yX3ZlcnNpb247Ci0gIF9fbGUxNiBtaW5vcl92ZXJzaW9uOwotICBfX2xlMzIgZnRyX3NpemU7ICAgICAgLyogaW4gYnl0ZXMsIG5vdCBpbmNsdWRpbmcga2V5IGZvbGxvd2luZyAqLwotICBfX2xlMzIgZmxhZ3M7ICAgICAgICAgLyogU2VlIGFib3ZlICovCi0gIF9fbGUzMiBrZXlzaXplOyAgICAgICAvKiBpbiBieXRlcyAqLwotICBfX2xlMzIgY3J5cHRfdHlwZTsgICAgLyogaG93IG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkLiBNdXN0IGJlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIENSWVBUX1RZUEVfWFhYIHZhbHVlICovCi0gIF9fbGU2NCBmc19zaXplOyAgICAgICAvKiBTaXplIG9mIHRoZSBlbmNyeXB0ZWQgZnMsIGluIDUxMiBieXRlIHNlY3RvcnMgKi8KLSAgX19sZTMyIGZhaWxlZF9kZWNyeXB0X2NvdW50OyAvKiBjb3VudCBvZiAjIG9mIGZhaWxlZCBhdHRlbXB0cyB0byBkZWNyeXB0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50LCBzZXQgdG8gMCBvbiBzdWNjZXNzZnVsIG1vdW50ICovCi0gIHVuc2lnbmVkIGNoYXIgY3J5cHRvX3R5cGVfbmFtZVtNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU5dOyAvKiBUaGUgdHlwZSBvZiBlbmNyeXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gZGVjcnlwdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24sIG51bGwgdGVybWluYXRlZCAqLwotICBfX2xlMzIgc3BhcmUyOyAgICAgICAgLyogaWdub3JlZCAqLwotICB1bnNpZ25lZCBjaGFyIG1hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOyAvKiBUaGUgZW5jcnlwdGVkIGtleSBmb3IgZGVjcnlwdGluZyB0aGUgZmlsZXN5c3RlbSAqLwotICB1bnNpZ25lZCBjaGFyIHNhbHRbU0FMVF9MRU5dOyAgIC8qIFRoZSBzYWx0IHVzZWQgZm9yIHRoaXMgZW5jcnlwdGlvbiAqLwotICBfX2xlNjQgcGVyc2lzdF9kYXRhX29mZnNldFsyXTsgIC8qIEFic29sdXRlIG9mZnNldCB0byBib3RoIGNvcGllcyBvZiBjcnlwdF9wZXJzaXN0X2RhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbiBkZXZpY2Ugd2l0aCB0aGF0IGluZm8sIGVpdGhlciB0aGUgZm9vdGVyIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWxfYmxrZGV2aWNlIG9yIHRoZSBtZXRhZGF0YSBwYXJ0aXRpb24uICovCisgICAgX19sZTMyIG1hZ2ljOyAvKiBTZWUgYWJvdmUgKi8KKyAgICBfX2xlMTYgbWFqb3JfdmVyc2lvbjsKKyAgICBfX2xlMTYgbWlub3JfdmVyc2lvbjsKKyAgICBfX2xlMzIgZnRyX3NpemU7ICAgICAgICAgICAgIC8qIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIGtleSBmb2xsb3dpbmcgKi8KKyAgICBfX2xlMzIgZmxhZ3M7ICAgICAgICAgICAgICAgIC8qIFNlZSBhYm92ZSAqLworICAgIF9fbGUzMiBrZXlzaXplOyAgICAgICAgICAgICAgLyogaW4gYnl0ZXMgKi8KKyAgICBfX2xlMzIgY3J5cHRfdHlwZTsgICAgICAgICAgIC8qIGhvdyBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZC4gTXVzdCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBDUllQVF9UWVBFX1hYWCB2YWx1ZSAqLworICAgIF9fbGU2NCBmc19zaXplOyAgICAgICAgICAgICAgLyogU2l6ZSBvZiB0aGUgZW5jcnlwdGVkIGZzLCBpbiA1MTIgYnl0ZSBzZWN0b3JzICovCisgICAgX19sZTMyIGZhaWxlZF9kZWNyeXB0X2NvdW50OyAvKiBjb3VudCBvZiAjIG9mIGZhaWxlZCBhdHRlbXB0cyB0byBkZWNyeXB0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnQsIHNldCB0byAwIG9uIHN1Y2Nlc3NmdWwgbW91bnQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGNyeXB0b190eXBlX25hbWVbTUFYX0NSWVBUT19UWVBFX05BTUVfTEVOXTsgLyogVGhlIHR5cGUgb2YgZW5jcnlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gZGVjcnlwdCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiwgbnVsbCB0ZXJtaW5hdGVkICovCisgICAgX19sZTMyIHNwYXJlMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZWQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG1hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOyAvKiBUaGUgZW5jcnlwdGVkIGtleSBmb3IgZGVjcnlwdGluZyB0aGUgZmlsZXN5c3RlbSAqLworICAgIHVuc2lnbmVkIGNoYXIgc2FsdFtTQUxUX0xFTl07ICAgICAgICAgIC8qIFRoZSBzYWx0IHVzZWQgZm9yIHRoaXMgZW5jcnlwdGlvbiAqLworICAgIF9fbGU2NCBwZXJzaXN0X2RhdGFfb2Zmc2V0WzJdOyAgICAgICAgIC8qIEFic29sdXRlIG9mZnNldCB0byBib3RoIGNvcGllcyBvZiBjcnlwdF9wZXJzaXN0X2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbiBkZXZpY2Ugd2l0aCB0aGF0IGluZm8sIGVpdGhlciB0aGUgZm9vdGVyIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWxfYmxrZGV2aWNlIG9yIHRoZSBtZXRhZGF0YSBwYXJ0aXRpb24uICovCiAKLSAgX19sZTMyIHBlcnNpc3RfZGF0YV9zaXplOyAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCB0byBlYWNoIGNvcHkgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGVyc2lzdGVudCBkYXRhIHRhYmxlKi8KKyAgICBfX2xlMzIgcGVyc2lzdF9kYXRhX3NpemU7IC8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIHRvIGVhY2ggY29weSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBlcnNpc3RlbnQgZGF0YSB0YWJsZSovCiAKLSAgX19sZTggIGtkZl90eXBlOyAvKiBUaGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gdXNlZC4gKi8KKyAgICBfX2xlOCBrZGZfdHlwZTsgLyogVGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIHVzZWQuICovCiAKLSAgLyogc2NyeXB0IHBhcmFtZXRlcnMuIFNlZSB3d3cudGFyc25hcC5jb20vc2NyeXB0L3NjcnlwdC5wZGYgKi8KLSAgX19sZTggIE5fZmFjdG9yOyAvKiAoMSA8PCBOKSAqLwotICBfX2xlOCAgcl9mYWN0b3I7IC8qICgxIDw8IHIpICovCi0gIF9fbGU4ICBwX2ZhY3RvcjsgLyogKDEgPDwgcCkgKi8KLSAgX19sZTY0IGVuY3J5cHRlZF91cHRvOyAvKiBJZiB3ZSBhcmUgaW4gc3RhdGUgQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBoYXZlIHRvIHN0b3AgKGUuZy4gcG93ZXIgbG93KSB0aGlzIGlzIHRoZSBsYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIDUxMiBieXRlIHNlY3Rvci4qLwotICBfX2xlOCAgaGFzaF9maXJzdF9ibG9ja1tTSEEyNTZfRElHRVNUX0xFTkdUSF07IC8qIFdoZW4gQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgaGFzaCBvZiBmaXJzdCBibG9jaywgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHZhbGlkYXRlIGJlZm9yZSBjb250aW51aW5nKi8KKyAgICAvKiBzY3J5cHQgcGFyYW1ldGVycy4gU2VlIHd3dy50YXJzbmFwLmNvbS9zY3J5cHQvc2NyeXB0LnBkZiAqLworICAgIF9fbGU4IE5fZmFjdG9yOyAgICAgICAgLyogKDEgPDwgTikgKi8KKyAgICBfX2xlOCByX2ZhY3RvcjsgICAgICAgIC8qICgxIDw8IHIpICovCisgICAgX19sZTggcF9mYWN0b3I7ICAgICAgICAvKiAoMSA8PCBwKSAqLworICAgIF9fbGU2NCBlbmNyeXB0ZWRfdXB0bzsgLyogSWYgd2UgYXJlIGluIHN0YXRlIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBoYXZlIHRvIHN0b3AgKGUuZy4gcG93ZXIgbG93KSB0aGlzIGlzIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgNTEyIGJ5dGUgc2VjdG9yLiovCisgICAgX19sZTggaGFzaF9maXJzdF9ibG9ja1tTSEEyNTZfRElHRVNUX0xFTkdUSF07IC8qIFdoZW4gQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsIGhhc2ggb2YgZmlyc3QgYmxvY2ssIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdmFsaWRhdGUgYmVmb3JlIGNvbnRpbnVpbmcqLwogCi0gIC8qIGtleV9tYXN0ZXIga2V5LCB1c2VkIHRvIHNpZ24gdGhlIGRlcml2ZWQga2V5IHdoaWNoIGlzIHRoZW4gdXNlZCB0byBnZW5lcmF0ZQotICAgKiB0aGUgaW50ZXJtZWRpYXRlIGtleQotICAgKiBUaGlzIGtleSBzaG91bGQgYmUgdXNlZCBmb3Igbm8gb3RoZXIgcHVycG9zZXMhIFdlIHVzZSB0aGlzIGtleSB0byBzaWduIHVucGFkZGVkIAotICAgKiBkYXRhLCB3aGljaCBpcyBhY2NlcHRhYmxlIGJ1dCBvbmx5IGlmIHRoZSBrZXkgaXMgbm90IHJldXNlZCBlbHNld2hlcmUuICovCi0gIF9fbGU4IGtleW1hc3Rlcl9ibG9iW0tFWU1BU1RFUl9CTE9CX1NJWkVdOwotICBfX2xlMzIga2V5bWFzdGVyX2Jsb2Jfc2l6ZTsKKyAgICAvKiBrZXlfbWFzdGVyIGtleSwgdXNlZCB0byBzaWduIHRoZSBkZXJpdmVkIGtleSB3aGljaCBpcyB0aGVuIHVzZWQgdG8gZ2VuZXJhdGUKKyAgICAgKiB0aGUgaW50ZXJtZWRpYXRlIGtleQorICAgICAqIFRoaXMga2V5IHNob3VsZCBiZSB1c2VkIGZvciBubyBvdGhlciBwdXJwb3NlcyEgV2UgdXNlIHRoaXMga2V5IHRvIHNpZ24gdW5wYWRkZWQKKyAgICAgKiBkYXRhLCB3aGljaCBpcyBhY2NlcHRhYmxlIGJ1dCBvbmx5IGlmIHRoZSBrZXkgaXMgbm90IHJldXNlZCBlbHNld2hlcmUuICovCisgICAgX19sZTgga2V5bWFzdGVyX2Jsb2JbS0VZTUFTVEVSX0JMT0JfU0laRV07CisgICAgX19sZTMyIGtleW1hc3Rlcl9ibG9iX3NpemU7CiAKLSAgLyogU3RvcmUgc2NyeXB0IG9mIHNhbHRlZCBpbnRlcm1lZGlhdGUga2V5LiBXaGVuIGRlY3J5cHRpb24gZmFpbHMsIHdlIGNhbgotICAgICBjaGVjayBpZiB0aGlzIG1hdGNoZXMsIGFuZCBpZiBpdCBkb2VzLCB3ZSBrbm93IHRoYXQgdGhlIHByb2JsZW0gaXMgd2l0aCB0aGUKLSAgICAgZHJpdmUsIGFuZCB0aGVyZSBpcyBubyBwb2ludCBpbiBhc2tpbmcgdGhlIHVzZXIgZm9yIG1vcmUgcGFzc3dvcmRzLgorICAgIC8qIFN0b3JlIHNjcnlwdCBvZiBzYWx0ZWQgaW50ZXJtZWRpYXRlIGtleS4gV2hlbiBkZWNyeXB0aW9uIGZhaWxzLCB3ZSBjYW4KKyAgICAgICBjaGVjayBpZiB0aGlzIG1hdGNoZXMsIGFuZCBpZiBpdCBkb2VzLCB3ZSBrbm93IHRoYXQgdGhlIHByb2JsZW0gaXMgd2l0aCB0aGUKKyAgICAgICBkcml2ZSwgYW5kIHRoZXJlIGlzIG5vIHBvaW50IGluIGFza2luZyB0aGUgdXNlciBmb3IgbW9yZSBwYXNzd29yZHMuCiAKLSAgICAgTm90ZSB0aGF0IGlmIGFueSBwYXJ0IG9mIHRoaXMgc3RydWN0dXJlIGlzIGNvcnJ1cHQsIHRoaXMgd2lsbCBub3QgbWF0Y2ggYW5kCi0gICAgIHdlIHdpbGwgY29udGludWUgdG8gYmVsaWV2ZSB0aGUgdXNlciBlbnRlcmVkIHRoZSB3cm9uZyBwYXNzd29yZC4gSW4gdGhhdAotICAgICBjYXNlIHRoZSBvbmx5IHNvbHV0aW9uIGlzIGZvciB0aGUgdXNlciB0byBlbnRlciBhIHBhc3N3b3JkIGVub3VnaCB0aW1lcyB0bwotICAgICBmb3JjZSBhIHdpcGUuCisgICAgICAgTm90ZSB0aGF0IGlmIGFueSBwYXJ0IG9mIHRoaXMgc3RydWN0dXJlIGlzIGNvcnJ1cHQsIHRoaXMgd2lsbCBub3QgbWF0Y2ggYW5kCisgICAgICAgd2Ugd2lsbCBjb250aW51ZSB0byBiZWxpZXZlIHRoZSB1c2VyIGVudGVyZWQgdGhlIHdyb25nIHBhc3N3b3JkLiBJbiB0aGF0CisgICAgICAgY2FzZSB0aGUgb25seSBzb2x1dGlvbiBpcyBmb3IgdGhlIHVzZXIgdG8gZW50ZXIgYSBwYXNzd29yZCBlbm91Z2ggdGltZXMgdG8KKyAgICAgICBmb3JjZSBhIHdpcGUuCiAKLSAgICAgTm90ZSBhbHNvIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBtaWdyYXRpb24uIElmIHRoaXMgZGF0YSBpcwotICAgICB3cm9uZywgd2Ugc2ltcGx5IHdvbid0IHJlY29nbmlzZSBhIHJpZ2h0IHBhc3N3b3JkLCBhbmQgd2lsbCBjb250aW51ZSB0bwotICAgICBwcm9tcHQuIE9uIHRoZSBmaXJzdCBwYXNzd29yZCBjaGFuZ2UsIHRoaXMgdmFsdWUgd2lsbCBiZSBwb3B1bGF0ZWQgYW5kCi0gICAgIHRoZW4gd2Ugd2lsbCBiZSBPSy4KLSAgICovCi0gIHVuc2lnbmVkIGNoYXIgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleVtTQ1JZUFRfTEVOXTsKKyAgICAgICBOb3RlIGFsc28gdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IG1pZ3JhdGlvbi4gSWYgdGhpcyBkYXRhIGlzCisgICAgICAgd3JvbmcsIHdlIHNpbXBseSB3b24ndCByZWNvZ25pc2UgYSByaWdodCBwYXNzd29yZCwgYW5kIHdpbGwgY29udGludWUgdG8KKyAgICAgICBwcm9tcHQuIE9uIHRoZSBmaXJzdCBwYXNzd29yZCBjaGFuZ2UsIHRoaXMgdmFsdWUgd2lsbCBiZSBwb3B1bGF0ZWQgYW5kCisgICAgICAgdGhlbiB3ZSB3aWxsIGJlIE9LLgorICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleVtTQ1JZUFRfTEVOXTsKIAotICAvKiBzaGEgb2YgdGhpcyBzdHJ1Y3R1cmUgd2l0aCB0aGlzIGVsZW1lbnQgc2V0IHRvIHplcm8KLSAgICAgVXNlZCB3aGVuIGVuY3J5cHRpbmcgb24gcmVib290IHRvIHZhbGlkYXRlIHN0cnVjdHVyZSBiZWZvcmUgZG9pbmcgc29tZXRoaW5nCi0gICAgIGZhdGFsCi0gICAqLwotICB1bnNpZ25lZCBjaGFyIHNoYTI1NltTSEEyNTZfRElHRVNUX0xFTkdUSF07CisgICAgLyogc2hhIG9mIHRoaXMgc3RydWN0dXJlIHdpdGggdGhpcyBlbGVtZW50IHNldCB0byB6ZXJvCisgICAgICAgVXNlZCB3aGVuIGVuY3J5cHRpbmcgb24gcmVib290IHRvIHZhbGlkYXRlIHN0cnVjdHVyZSBiZWZvcmUgZG9pbmcgc29tZXRoaW5nCisgICAgICAgZmF0YWwKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNoYTI1NltTSEEyNTZfRElHRVNUX0xFTkdUSF07CiB9OwogCiAvKiBQZXJzaXN0YW50IGRhdGEgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIGJlZm9yZSBkZWNyeXB0aW9uLgpAQCAtMTc4LDQ5ICsxODcsNDkgQEAKICAqIGFuZCBoaWdoZXIgY3J5cHRfbW50X2Z0ciBzdHJ1Y3R1cmVzLgogICovCiBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9lbnRyeSB7Ci0gIGNoYXIga2V5W1BST1BFUlRZX0tFWV9NQVhdOwotICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNoYXIga2V5W1BST1BFUlRZX0tFWV9NQVhdOworICAgIGNoYXIgdmFsW1BST1BFUlRZX1ZBTFVFX01BWF07CiB9OwogCiAvKiBTaG91bGQgYmUgZXhhY3RseSA0SyBpbiBzaXplICovCiBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhIHsKLSAgX19sZTMyIHBlcnNpc3RfbWFnaWM7Ci0gIF9fbGUzMiBwZXJzaXN0X3ZhbGlkX2VudHJpZXM7Ci0gIF9fbGUzMiBwZXJzaXN0X3NwYXJlWzMwXTsKLSAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZW50cnkgcGVyc2lzdF9lbnRyeVswXTsKKyAgICBfX2xlMzIgcGVyc2lzdF9tYWdpYzsKKyAgICBfX2xlMzIgcGVyc2lzdF92YWxpZF9lbnRyaWVzOworICAgIF9fbGUzMiBwZXJzaXN0X3NwYXJlWzMwXTsKKyAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9lbnRyeSBwZXJzaXN0X2VudHJ5WzBdOwogfTsKIAogI2RlZmluZSBEQVRBX01OVF9QT0lOVCAiL2RhdGEiCiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIGNyeXB0ZnNfY3J5cHRvX2NvbXBsZXRlICovCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEICAxCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9FTkNSWVBURUQgICAgICAwCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9CQURfTUVUQURBVEEgICgtMSkKLSNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX1BBUlRJQUwgICAgICAgKC0yKQotI2RlZmluZSBDUllQVE9fQ09NUExFVEVfSU5DT05TSVNURU5UICAoLTMpCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9DT1JSVVBUICAgICAgICgtNCkKKyNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQgMQorI2RlZmluZSBDUllQVE9fQ09NUExFVEVfRU5DUllQVEVEIDAKKyNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0JBRF9NRVRBREFUQSAoLTEpCisjZGVmaW5lIENSWVBUT19DT01QTEVURV9QQVJUSUFMICgtMikKKyNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0lOQ09OU0lTVEVOVCAoLTMpCisjZGVmaW5lIENSWVBUT19DT01QTEVURV9DT1JSVVBUICgtNCkKIAogLyogUmV0dXJuIHZhbHVlcyBmb3IgY3J5cHRmc19lbmFibGVfaW5wbGFjZSooKSAqLwogI2RlZmluZSBFTkFCTEVfSU5QTEFDRV9PSyAwCiAjZGVmaW5lIEVOQUJMRV9JTlBMQUNFX0VSUl9PVEhFUiAoLTEpCi0jZGVmaW5lIEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYgKC0yKSAgLyogY3J5cHRvX2Jsa2RldiBpc3N1ZSAqLworI2RlZmluZSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWICgtMikgLyogY3J5cHRvX2Jsa2RldiBpc3N1ZSAqLwogCiAvKiBSZXR1cm4gdmFsdWVzIGZvciBjcnlwdGZzX2dldGZpZWxkICovCi0jZGVmaW5lIENSWVBUT19HRVRGSUVMRF9PSyAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIENSWVBUT19HRVRGSUVMRF9FUlJPUl9OT19GSUVMRCAgICAgICgtMSkKLSNkZWZpbmUgQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX09USEVSICAgICAgICAgKC0yKQorI2RlZmluZSBDUllQVE9fR0VURklFTERfT0sgMAorI2RlZmluZSBDUllQVE9fR0VURklFTERfRVJST1JfTk9fRklFTEQgKC0xKQorI2RlZmluZSBDUllQVE9fR0VURklFTERfRVJST1JfT1RIRVIgKC0yKQogI2RlZmluZSBDUllQVE9fR0VURklFTERfRVJST1JfQlVGX1RPT19TTUFMTCAoLTMpCiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIGNyeXB0ZnNfc2V0ZmllbGQgKi8KLSNkZWZpbmUgQ1JZUFRPX1NFVEZJRUxEX09LICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIENSWVBUT19TRVRGSUVMRF9FUlJPUl9PVEhFUiAgICAgICAgICAoLTEpCisjZGVmaW5lIENSWVBUT19TRVRGSUVMRF9PSyAwCisjZGVmaW5lIENSWVBUT19TRVRGSUVMRF9FUlJPUl9PVEhFUiAoLTEpCiAjZGVmaW5lIENSWVBUT19TRVRGSUVMRF9FUlJPUl9GSUVMRF9UT09fTE9ORyAoLTIpCiAjZGVmaW5lIENSWVBUT19TRVRGSUVMRF9FUlJPUl9WQUxVRV9UT09fTE9ORyAoLTMpCiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIHBlcnNpc3RfZGVsX2tleSAqLwotI2RlZmluZSBQRVJTSVNUX0RFTF9LRVlfT0sgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX0VSUk9SX09USEVSICAgICAgICgtMSkKLSNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX0VSUk9SX05PX0ZJRUxEICAgICgtMikKKyNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX09LIDAKKyNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX0VSUk9SX09USEVSICgtMSkKKyNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX0VSUk9SX05PX0ZJRUxEICgtMikKIAogaW50IG1hdGNoX211bHRpX2VudHJ5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogZmllbGQsIHVuc2lnbmVkIGluZGV4KTsKIGludCB3YWl0X2FuZF91bm1vdW50KGNvbnN0IGNoYXIqIG1vdW50cG9pbnQsIGJvb2wga2lsbCk7CmRpZmYgLS1naXQgYS9mcy9FeHQ0LmNwcCBiL2ZzL0V4dDQuY3BwCmluZGV4IDg5Yjg0MTQuLjgwNmNmZDEgMTAwNjQ0Ci0tLSBhL2ZzL0V4dDQuY3BwCisrKyBiL2ZzL0V4dDQuY3BwCkBAIC0xNCw0MCArMTQsMzQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KIAotI2RlZmluZSBMT0dfVEFHICJWb2xkIgotCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxleHQ0X3V0aWxzL2V4dDRfY3J5cHQuaD4KKyNpbmNsdWRlIDxmc2NyeXB0L2ZzY3J5cHQuaD4KICNpbmNsdWRlIDxsb2d3cmFwL2xvZ3dyYXAuaD4KICNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KIAogI2luY2x1ZGUgIkV4dDQuaCIKLSNpbmNsdWRlICJFeHQ0Q3J5cHQuaCIKKyNpbmNsdWRlICJGc0NyeXB0LmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2xkVXRpbC5oIgogCkBAIC02Miw5ICs1Niw4IEBACiBzdGF0aWMgY29uc3QgY2hhcioga0ZzY2tQYXRoID0gIi9zeXN0ZW0vYmluL2UyZnNjayI7CiAKIGJvb2wgSXNTdXBwb3J0ZWQoKSB7Ci0gICAgcmV0dXJuIGFjY2VzcyhrTWtmc1BhdGgsIFhfT0spID09IDAKLSAgICAgICAgICAgICYmIGFjY2VzcyhrRnNja1BhdGgsIFhfT0spID09IDAKLSAgICAgICAgICAgICYmIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZXh0NCIpOworICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwICYmIGFjY2VzcyhrRnNja1BhdGgsIFhfT0spID09IDAgJiYKKyAgICAgICAgICAgSXNGaWxlc3lzdGVtU3VwcG9ydGVkKCJleHQ0Iik7CiB9CiAKIHN0YXR1c190IENoZWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQpIHsKQEAgLTc3LDcgKzcwLDcgQEAKICAgICBpbnQgc3RhdHVzOwogICAgIGludCByZXQ7CiAgICAgbG9uZyB0bXBtbnRfZmxhZ3MgPSBNU19OT0FUSU1FIHwgTVNfTk9FWEVDIHwgTVNfTk9TVUlEOwotICAgIGNoYXIgKnRtcG1udF9vcHRzID0gKGNoYXIqKSAibm9tYmxrX2lvX3N1Ym1pdCxlcnJvcnM9cmVtb3VudC1ybyI7CisgICAgY2hhciogdG1wbW50X29wdHMgPSAoY2hhciopIm5vbWJsa19pb19zdWJtaXQsZXJyb3JzPXJlbW91bnQtcm8iOwogCiAgICAgLyoKICAgICAgKiBGaXJzdCB0cnkgdG8gbW91bnQgYW5kIHVubW91bnQgdGhlIGZpbGVzeXN0ZW0uICBXZSBkbyB0aGlzIGJlY2F1c2UKQEAgLTEwMiw3ICs5NSw4IEBACiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dXKCIlcygpOiB1bW91bnQoJXMpPSVkOiAlc1xuIiwgX19mdW5jX18sIGNfdGFyZ2V0LCByZXN1bHQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIigpOiB1bW91bnQoIiA8PCBjX3RhcmdldCA8PCAiKT0iIDw8IHJlc3VsdCA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RyZXJyb3IoZXJybm8pOwogICAgICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTIsMTAgKzEwNiwxMCBAQAogICAgICAqIChlLmcuIHJlY2VudCBTREsgc3lzdGVtIGltYWdlcykuIERldGVjdCB0aGVzZSBhbmQgc2tpcCB0aGUgY2hlY2suCiAgICAgICovCiAgICAgaWYgKGFjY2VzcyhrRnNja1BhdGgsIFhfT0spKSB7Ci0gICAgICAgIEFMT0dEKCJOb3QgcnVubmluZyAlcyBvbiAlcyAoZXhlY3V0YWJsZSBub3QgaW4gc3lzdGVtIGltYWdlKVxuIiwKLSAgICAgICAgICAgICAgICBrRnNja1BhdGgsIGNfc291cmNlKTsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTm90IHJ1bm5pbmcgIiA8PCBrRnNja1BhdGggPDwgIiBvbiAiIDw8IGNfc291cmNlCisgICAgICAgICAgICAgICAgICAgPDwgIiAoZXhlY3V0YWJsZSBub3QgaW4gc3lzdGVtIGltYWdlKSI7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0QoIlJ1bm5pbmcgJXMgb24gJXNcbiIsIGtGc2NrUGF0aCwgY19zb3VyY2UpOworICAgICAgICBMT0coREVCVUcpIDw8ICJSdW5uaW5nICIgPDwga0ZzY2tQYXRoIDw8ICIgb24gIiA8PCBjX3NvdXJjZTsKIAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY21kOwogICAgICAgICBjbWQucHVzaF9iYWNrKGtGc2NrUGF0aCk7CkBAIC0xMjksOCArMTIzLDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywKLSAgICAgICAgYm9vbCByZW1vdW50LCBib29sIGV4ZWN1dGFibGUpIHsKK3N0YXR1c190IE1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGJvb2wgcm8sIGJvb2wgcmVtb3VudCwKKyAgICAgICAgICAgICAgIGJvb2wgZXhlY3V0YWJsZSkgewogICAgIGludCByYzsKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xNjQsOCArMTU4LDcgQEAKICAgICByZXR1cm4gRm9ya0V4ZWN2cChjbWQpOwogfQogCi1zdGF0dXNfdCBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0KSB7CitzdGF0dXNfdCBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0KSB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNtZDsKICAgICBjbWQucHVzaF9iYWNrKGtNa2ZzUGF0aCk7CiAKQEAgLTE4Miw3ICsxNzUsNyBAQAogICAgIGlmIChhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInZvbGQuaGFzX3F1b3RhIiwgZmFsc2UpKSB7CiAgICAgICAgIG9wdGlvbnMgKz0gIixxdW90YSI7CiAgICAgfQotICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgb3B0aW9ucyArPSAiLGVuY3J5cHQiOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZnMvRXh0NC5oIGIvZnMvRXh0NC5oCmluZGV4IGY3OGRjOTUuLjMyOWYzMDIgMTAwNjQ0Ci0tLSBhL2ZzL0V4dDQuaAorKysgYi9mcy9FeHQ0LmgKQEAgLTI4LDEwICsyOCw5IEBACiBib29sIElzU3VwcG9ydGVkKCk7CiAKIHN0YXR1c190IENoZWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQpOwotc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywKLSAgICAgICAgYm9vbCByZW1vdW50LCBib29sIGV4ZWN1dGFibGUpOwotc3RhdHVzX3QgRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCk7CitzdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLCBib29sIHJlbW91bnQsCisgICAgICAgICAgICAgICBib29sIGV4ZWN1dGFibGUpOworc3RhdHVzX3QgRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCk7CiBzdGF0dXNfdCBSZXNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKTsKIAogfSAgLy8gbmFtZXNwYWNlIGV4dDQKZGlmZiAtLWdpdCBhL2ZzL0YyZnMuY3BwIGIvZnMvRjJmcy5jcHAKaW5kZXggZjI0ZmQ5MS4uYzZlMGY1MiAxMDA2NDQKLS0tIGEvZnMvRjJmcy5jcHAKKysrIGIvZnMvRjJmcy5jcHAKQEAgLTIwLDEwICsyMCwxMCBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+CisjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CiAKLSNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogCkBAIC0zNyw5ICszNyw4IEBACiBzdGF0aWMgY29uc3QgY2hhcioga0ZzY2tQYXRoID0gIi9zeXN0ZW0vYmluL2ZzY2suZjJmcyI7CiAKIGJvb2wgSXNTdXBwb3J0ZWQoKSB7Ci0gICAgcmV0dXJuIGFjY2VzcyhrTWtmc1BhdGgsIFhfT0spID09IDAKLSAgICAgICAgICAgICYmIGFjY2VzcyhrRnNja1BhdGgsIFhfT0spID09IDAKLSAgICAgICAgICAgICYmIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZjJmcyIpOworICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwICYmIGFjY2VzcyhrRnNja1BhdGgsIFhfT0spID09IDAgJiYKKyAgICAgICAgICAgSXNGaWxlc3lzdGVtU3VwcG9ydGVkKCJmMmZzIik7CiB9CiAKIHN0YXR1c190IENoZWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UpIHsKQEAgLTgyLDcgKzgxLDcgQEAKICAgICAgICAgY21kLnB1c2hfYmFjaygiLU8iKTsKICAgICAgICAgY21kLnB1c2hfYmFjaygicXVvdGEiKTsKICAgICB9Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICBjbWQucHVzaF9iYWNrKCItTyIpOwogICAgICAgICBjbWQucHVzaF9iYWNrKCJlbmNyeXB0Iik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZnMvVmZhdC5jcHAgYi9mcy9WZmF0LmNwcAppbmRleCA1MzgxNzhlLi43YjgzM2QxIDEwMDY0NAotLS0gYS9mcy9WZmF0LmNwcAorKysgYi9mcy9WZmF0LmNwcApAQCAtMTQsMjQgKzE0LDIxIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAKQEAgLTQxLDggKzM4LDggQEAKIAogI2luY2x1ZGUgPGxvZ3dyYXAvbG9nd3JhcC5oPgogCi0jaW5jbHVkZSAiVmZhdC5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCisjaW5jbHVkZSAiVmZhdC5oIgogI2luY2x1ZGUgIlZvbGRVdGlsLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKQEAgLTU1LDkgKzUyLDggQEAKIHN0YXRpYyBjb25zdCBjaGFyKiBrRnNja1BhdGggPSAiL3N5c3RlbS9iaW4vZnNja19tc2RvcyI7CiAKIGJvb2wgSXNTdXBwb3J0ZWQoKSB7Ci0gICAgcmV0dXJuIGFjY2VzcyhrTWtmc1BhdGgsIFhfT0spID09IDAKLSAgICAgICAgICAgICYmIGFjY2VzcyhrRnNja1BhdGgsIFhfT0spID09IDAKLSAgICAgICAgICAgICYmIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgidmZhdCIpOworICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwICYmIGFjY2VzcyhrRnNja1BhdGgsIFhfT0spID09IDAgJiYKKyAgICAgICAgICAgSXNGaWxlc3lzdGVtU3VwcG9ydGVkKCJ2ZmF0Iik7CiB9CiAKIHN0YXR1c190IENoZWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UpIHsKQEAgLTc5LDQzICs3NSw0MiBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgc3dpdGNoKHJjKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBjb21wbGV0ZWQgT0siOwotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN3aXRjaCAocmMpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgY29tcGxldGVkIE9LIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGZhaWxlZCAobm90IGEgRkFUIGZpbGVzeXN0ZW0pIjsKLSAgICAgICAgICAgIGVycm5vID0gRU5PREFUQTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGZhaWxlZCAobm90IGEgRkFUIGZpbGVzeXN0ZW0pIjsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVOT0RBVEE7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGlmIChwYXNzKysgPD0gMykgewotICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmlsZXN5c3RlbSBtb2RpZmllZCAtIHJlY2hlY2tpbmcgKHBhc3MgIiA8PCBwYXNzIDw8ICIpIjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxpbmcgY2hlY2sgYWZ0ZXIgdG9vIG1hbnkgcmVjaGVja3MiOwotICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgaWYgKHBhc3MrKyA8PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmlsZXN5c3RlbSBtb2RpZmllZCAtIHJlY2hlY2tpbmcgKHBhc3MgIiA8PCBwYXNzIDw8ICIpIjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxpbmcgY2hlY2sgYWZ0ZXIgdG9vIG1hbnkgcmVjaGVja3MiOworICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGZhaWxlZCAobm8gZmlsZXN5c3RlbSkiOwotICAgICAgICAgICAgZXJybm8gPSBFTk9EQVRBOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgZmFpbGVkIChubyBmaWxlc3lzdGVtKSI7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFTk9EQVRBOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQgKHVua25vd24gZXhpdCBjb2RlICIgPDwgcmMgPDwgIikiOwotICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgZmFpbGVkICh1bmtub3duIGV4aXQgY29kZSAiIDw8IHJjIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9IHdoaWxlICgwKTsKIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLAotICAgICAgICBib29sIHJlbW91bnQsIGJvb2wgZXhlY3V0YWJsZSwgaW50IG93bmVyVWlkLCBpbnQgb3duZXJHaWQsIGludCBwZXJtTWFzaywKLSAgICAgICAgYm9vbCBjcmVhdGVMb3N0KSB7CitzdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLCBib29sIHJlbW91bnQsCisgICAgICAgICAgICAgICBib29sIGV4ZWN1dGFibGUsIGludCBvd25lclVpZCwgaW50IG93bmVyR2lkLCBpbnQgcGVybU1hc2ssIGJvb2wgY3JlYXRlTG9zdCkgewogICAgIGludCByYzsKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMjgsOSArMTIzLDkgQEAKICAgICBmbGFncyB8PSAocm8gPyBNU19SRE9OTFkgOiAwKTsKICAgICBmbGFncyB8PSAocmVtb3VudCA/IE1TX1JFTU9VTlQgOiAwKTsKIAotICAgIGF1dG8gbW91bnREYXRhID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgInV0ZjgsdWlkPSVkLGdpZD0lZCxmbWFzaz0lbyxkbWFzaz0lbyxzaG9ydG5hbWU9bWl4ZWQiLAotICAgICAgICAgICAgb3duZXJVaWQsIG93bmVyR2lkLCBwZXJtTWFzaywgcGVybU1hc2spOworICAgIGF1dG8gbW91bnREYXRhID0KKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCJ1dGY4LHVpZD0lZCxnaWQ9JWQsZm1hc2s9JW8sZG1hc2s9JW8sc2hvcnRuYW1lPW1peGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyVWlkLCBvd25lckdpZCwgcGVybU1hc2ssIHBlcm1NYXNrKTsKIAogICAgIHJjID0gbW91bnQoY19zb3VyY2UsIGNfdGFyZ2V0LCAidmZhdCIsIGZsYWdzLCBtb3VudERhdGEuY19zdHIoKSk7CiAKQEAgLTE1OSwxMiArMTU0LDggQEAKIHN0YXR1c190IEZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpIHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY21kOwogICAgIGNtZC5wdXNoX2JhY2soa01rZnNQYXRoKTsKLSAgICBjbWQucHVzaF9iYWNrKCItRiIpOwotICAgIGNtZC5wdXNoX2JhY2soIjMyIik7CiAgICAgY21kLnB1c2hfYmFjaygiLU8iKTsKICAgICBjbWQucHVzaF9iYWNrKCJhbmRyb2lkIik7Ci0gICAgY21kLnB1c2hfYmFjaygiLWMiKTsKLSAgICBjbWQucHVzaF9iYWNrKCI2NCIpOwogICAgIGNtZC5wdXNoX2JhY2soIi1BIik7CiAKICAgICBpZiAobnVtU2VjdG9ycykgewpkaWZmIC0tZ2l0IGEvZnMvVmZhdC5oIGIvZnMvVmZhdC5oCmluZGV4IDQwYmU1ZjYuLjIwMzAwNjcgMTAwNjQ0Ci0tLSBhL2ZzL1ZmYXQuaAorKysgYi9mcy9WZmF0LmgKQEAgLTI4LDkgKzI4LDggQEAKIGJvb2wgSXNTdXBwb3J0ZWQoKTsKIAogc3RhdHVzX3QgQ2hlY2soY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSk7Ci1zdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLAotICAgICAgICBib29sIHJlbW91bnQsIGJvb2wgZXhlY3V0YWJsZSwgaW50IG93bmVyVWlkLCBpbnQgb3duZXJHaWQsIGludCBwZXJtTWFzaywKLSAgICAgICAgYm9vbCBjcmVhdGVMb3N0KTsKK3N0YXR1c190IE1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGJvb2wgcm8sIGJvb2wgcmVtb3VudCwKKyAgICAgICAgICAgICAgIGJvb2wgZXhlY3V0YWJsZSwgaW50IG93bmVyVWlkLCBpbnQgb3duZXJHaWQsIGludCBwZXJtTWFzaywgYm9vbCBjcmVhdGVMb3N0KTsKIHN0YXR1c190IEZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpOwogCiB9ICAvLyBuYW1lc3BhY2UgdmZhdApkaWZmIC0tZ2l0IGEvaGFzaC5oIGIvaGFzaC5oCmluZGV4IDNiNDgzZjEuLmNkODE4MDUgMTAwNjQ0Ci0tLSBhL2hhc2guaAorKysgYi9oYXNoLmgKQEAgLTEsMTggKzEsMTggQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCi0gKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgogICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIAotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAqCiAgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEtUSCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCiAgKiAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoKGEpPihiKSk/KGIpOihhKSkKKyNkZWZpbmUgbWluKGEsIGIpICgoKGEpID4gKGIpKSA/IChiKSA6IChhKSkKICNlbmRpZgogCiAvKiBWZWN0b3IgQ3JheXMgZG9lc24ndCBoYXZlIGEgZ29vZCAzMi1iaXQgdHlwZSwgb3IgbW9yZSBwcmVjaXNlbHksCkBAIC01MywxNCArNTMsMTIgQEAKICAgICovCiAKICNpZmRlZiBfQ1JBWQotI2RlZmluZSBDUkFZRklYKFgpICgoWCkgJiAweGZmZmZmZmZmKQorI2RlZmluZSBDUkFZRklYKFgpICgoWCkmMHhmZmZmZmZmZikKICNlbHNlCiAjZGVmaW5lIENSQVlGSVgoWCkgKFgpCiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB1X2ludDMyX3QKLWNzaGlmdCAodV9pbnQzMl90IHgsIHVuc2lnbmVkIGludCBuKQoteworc3RhdGljIGlubGluZSB1X2ludDMyX3QgY3NoaWZ0KHVfaW50MzJfdCB4LCB1bnNpZ25lZCBpbnQgbikgewogICAgIHggPSBDUkFZRklYKHgpOwogICAgIHJldHVybiBDUkFZRklYKCh4IDw8IG4pIHwgKHggPj4gKDMyIC0gbikpKTsKIH0KZGlmZiAtLWdpdCBhL21haW4uY3BwIGIvbWFpbi5jcHAKaW5kZXggNTUyNWU4NS4uZTFmODQwNCAxMDA2NDQKLS0tIGEvbWFpbi5jcHAKKysrIGIvbWFpbi5jcHAKQEAgLTE2LDU3ICsxNiw1NyBAQAogCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19QQUNLQUdFX01BTkFHRVIKIAotI2luY2x1ZGUgIm1vZGVsL0Rpc2suaCIKLSNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiTmV0bGlua01hbmFnZXIuaCIKICNpbmNsdWRlICJWb2xkTmF0aXZlU2VydmljZS5oIgogI2luY2x1ZGUgIlZvbGRVdGlsLmgiCisjaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgogI2luY2x1ZGUgImNyeXB0ZnMuaCIKKyNpbmNsdWRlICJtb2RlbC9EaXNrLmgiCiAjaW5jbHVkZSAic2VoYW5kbGUuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2tsb2cuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGZzX21nci5oPgogCiBzdGF0aWMgaW50IHByb2Nlc3NfY29uZmlnKFZvbHVtZU1hbmFnZXIqIHZtLCBib29sKiBoYXNfYWRvcHRhYmxlLCBib29sKiBoYXNfcXVvdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGhhc19yZXNlcnZlZCk7Ci1zdGF0aWMgdm9pZCBjb2xkYm9vdChjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyB2b2lkIGNvbGRib290KGNvbnN0IGNoYXIqIHBhdGgpOwogc3RhdGljIHZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpOwogCi1zdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlaGFuZGxlOworc3RydWN0IHNlbGFiZWxfaGFuZGxlKiBzZWhhbmRsZTsKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICAgICBhdHJhY2Vfc2V0X3RyYWNpbmdfZW5hYmxlZChmYWxzZSk7Ci0gICAgc2V0ZW52KCJBTkRST0lEX0xPR19UQUdTIiwgIio6diIsIDEpOworICAgIHNldGVudigiQU5EUk9JRF9MT0dfVEFHUyIsICIqOmQiLCAxKTsKICAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2LCBhbmRyb2lkOjpiYXNlOjpMb2dkTG9nZ2VyKGFuZHJvaWQ6OmJhc2U6OlNZU1RFTSkpOwogCiAgICAgTE9HKElORk8pIDw8ICJWb2xkIDMuMCAodGhlIGF3YWtlbmluZykgZmlyaW5nIHVwIjsKIAogICAgIEFUUkFDRV9CRUdJTigibWFpbiIpOwogCisgICAgTE9HKERFQlVHKSA8PCAiRGV0ZWN0ZWQgc3VwcG9ydCBmb3I6IgorICAgICAgICAgICAgICAgPDwgKGFuZHJvaWQ6OnZvbGQ6OklzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZXh0NCIpID8gIiBleHQ0IiA6ICIiKQorICAgICAgICAgICAgICAgPDwgKGFuZHJvaWQ6OnZvbGQ6OklzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZjJmcyIpID8gIiBmMmZzIiA6ICIiKQorICAgICAgICAgICAgICAgPDwgKGFuZHJvaWQ6OnZvbGQ6OklzRmlsZXN5c3RlbVN1cHBvcnRlZCgidmZhdCIpID8gIiB2ZmF0IiA6ICIiKTsKIAotICAgIExPRyhWRVJCT1NFKSA8PCAiRGV0ZWN0ZWQgc3VwcG9ydCBmb3I6IgotICAgICAgICAgICAgPDwgKGFuZHJvaWQ6OnZvbGQ6OklzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZXh0NCIpID8gIiBleHQ0IiA6ICIiKQotICAgICAgICAgICAgPDwgKGFuZHJvaWQ6OnZvbGQ6OklzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZjJmcyIpID8gIiBmMmZzIiA6ICIiKQotICAgICAgICAgICAgPDwgKGFuZHJvaWQ6OnZvbGQ6OklzRmlsZXN5c3RlbVN1cHBvcnRlZCgidmZhdCIpID8gIiB2ZmF0IiA6ICIiKTsKLQotICAgIFZvbHVtZU1hbmFnZXIgKnZtOwotICAgIE5ldGxpbmtNYW5hZ2VyICpubTsKKyAgICBWb2x1bWVNYW5hZ2VyKiB2bTsKKyAgICBOZXRsaW5rTWFuYWdlciogbm07CiAKICAgICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogCkBAIC0xMDgsNiArMTA4LDggQEAKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbi4uLiBjb250aW51aW5nIGFueXdheXMiOwogICAgIH0KIAorICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDEsIGZhbHNlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKwogICAgIEFUUkFDRV9CRUdJTigiVm9sZE5hdGl2ZVNlcnZpY2U6OnN0YXJ0Iik7CiAgICAgaWYgKGFuZHJvaWQ6OnZvbGQ6OlZvbGROYXRpdmVTZXJ2aWNlOjpzdGFydCgpICE9IGFuZHJvaWQ6Ok9LKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzdGFydCBWb2xkTmF0aXZlU2VydmljZSI7CkBAIC0xNDUsMTkgKzE0NywyMSBAQAogCiBzdGF0aWMgdm9pZCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyKiogYXJndikgewogICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKLSAgICAgICAgeyJibGtpZF9jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdiJyB9LAotICAgICAgICB7ImJsa2lkX3VudHJ1c3RlZF9jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdCJyB9LAotICAgICAgICB7ImZzY2tfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZicgfSwKLSAgICAgICAgeyJmc2NrX3VudHJ1c3RlZF9jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJyB9LAorICAgICAgICB7ImJsa2lkX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2InfSwKKyAgICAgICAgeyJibGtpZF91bnRydXN0ZWRfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQid9LAorICAgICAgICB7ImZzY2tfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZid9LAorICAgICAgICB7ImZzY2tfdW50cnVzdGVkX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwKICAgICB9OwogCiAgICAgaW50IGM7CiAgICAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIiIsIG9wdHMsIG51bGxwdHIpKSAhPSAtMSkgewogICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgICAgICAgY2FzZSAnYic6IGFuZHJvaWQ6OnZvbGQ6OnNCbGtpZENvbnRleHQgPSBvcHRhcmc7IGJyZWFrOwogICAgICAgICBjYXNlICdCJzogYW5kcm9pZDo6dm9sZDo6c0Jsa2lkVW50cnVzdGVkQ29udGV4dCA9IG9wdGFyZzsgYnJlYWs7CiAgICAgICAgIGNhc2UgJ2YnOiBhbmRyb2lkOjp2b2xkOjpzRnNja0NvbnRleHQgPSBvcHRhcmc7IGJyZWFrOwogICAgICAgICBjYXNlICdGJzogYW5kcm9pZDo6dm9sZDo6c0ZzY2tVbnRydXN0ZWRDb250ZXh0ID0gb3B0YXJnOyBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgfQogICAgIH0KIApAQCAtMTY3LDMzICsxNzEsMzAgQEAKICAgICBDSEVDSyhhbmRyb2lkOjp2b2xkOjpzRnNja1VudHJ1c3RlZENvbnRleHQgIT0gbnVsbHB0cik7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX2NvbGRib290KERJUiAqZCwgaW50IGx2bCkgewotICAgIHN0cnVjdCBkaXJlbnQgKmRlOworc3RhdGljIHZvaWQgZG9fY29sZGJvb3QoRElSKiBkLCBpbnQgbHZsKSB7CisgICAgc3RydWN0IGRpcmVudCogZGU7CiAgICAgaW50IGRmZCwgZmQ7CiAKICAgICBkZmQgPSBkaXJmZChkKTsKIAogICAgIGZkID0gb3BlbmF0KGRmZCwgInVldmVudCIsIE9fV1JPTkxZIHwgT19DTE9FWEVDKTsKLSAgICBpZihmZCA+PSAwKSB7CisgICAgaWYgKGZkID49IDApIHsKICAgICAgICAgd3JpdGUoZmQsICJhZGRcbiIsIDQpOwogICAgICAgICBjbG9zZShmZCk7CiAgICAgfQogCi0gICAgd2hpbGUoKGRlID0gcmVhZGRpcihkKSkpIHsKLSAgICAgICAgRElSICpkMjsKKyAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpIHsKKyAgICAgICAgRElSKiBkMjsKIAotICAgICAgICBpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpCi0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKSBjb250aW51ZTsKIAotICAgICAgICBpZiAoZGUtPmRfdHlwZSAhPSBEVF9ESVIgJiYgbHZsID4gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoZGUtPmRfdHlwZSAhPSBEVF9ESVIgJiYgbHZsID4gMCkgY29udGludWU7CiAKICAgICAgICAgZmQgPSBvcGVuYXQoZGZkLCBkZS0+ZF9uYW1lLCBPX1JET05MWSB8IE9fRElSRUNUT1JZIHwgT19DTE9FWEVDKTsKLSAgICAgICAgaWYoZmQgPCAwKQotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChmZCA8IDApIGNvbnRpbnVlOwogCiAgICAgICAgIGQyID0gZmRvcGVuZGlyKGZkKTsKLSAgICAgICAgaWYoZDIgPT0gMCkKKyAgICAgICAgaWYgKGQyID09IDApCiAgICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgZG9fY29sZGJvb3QoZDIsIGx2bCArIDEpOwpAQCAtMjAyLDEwICsyMDMsMTAgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvbGRib290KGNvbnN0IGNoYXIgKnBhdGgpIHsKK3N0YXRpYyB2b2lkIGNvbGRib290KGNvbnN0IGNoYXIqIHBhdGgpIHsKICAgICBBVFJBQ0VfTkFNRSgiY29sZGJvb3QiKTsKLSAgICBESVIgKmQgPSBvcGVuZGlyKHBhdGgpOwotICAgIGlmKGQpIHsKKyAgICBESVIqIGQgPSBvcGVuZGlyKHBhdGgpOworICAgIGlmIChkKSB7CiAgICAgICAgIGRvX2NvbGRib290KGQsIDApOwogICAgICAgICBjbG9zZWRpcihkKTsKICAgICB9CkBAIC0yNDgsMTMgKzI0OSwxMyBAQAogICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprQWRvcHRhYmxlOwogICAgICAgICAgICAgICAgICpoYXNfYWRvcHRhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmc19tZ3JfaXNfbm9lbXVsYXRlZHNkKHJlYykKLSAgICAgICAgICAgICAgICAgICAgfHwgYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJ2b2xkLmRlYnVnLmRlZmF1bHRfcHJpbWFyeSIsIGZhbHNlKSkgeworICAgICAgICAgICAgaWYgKGZzX21ncl9pc19ub2VtdWxhdGVkc2QocmVjKSB8fAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgidm9sZC5kZWJ1Zy5kZWZhdWx0X3ByaW1hcnkiLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICBmbGFncyB8PSBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a0RlZmF1bHRQcmltYXJ5OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2bS0+YWRkRGlza1NvdXJjZShzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lTWFuYWdlcjo6RGlza1NvdXJjZT4oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVNYW5hZ2VyOjpEaXNrU291cmNlKHN5c1BhdHRlcm4sIG5pY2tuYW1lLCBmbGFncykpKTsKKyAgICAgICAgICAgICAgICBuZXcgVm9sdW1lTWFuYWdlcjo6RGlza1NvdXJjZShzeXNQYXR0ZXJuLCBuaWNrbmFtZSwgZmxhZ3MpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9tb2RlbC9EaXNrLmNwcCBiL21vZGVsL0Rpc2suY3BwCmluZGV4IGQ3YjE5YWMuLjNkMjVlNGMgMTAwNjQ0Ci0tLSBhL21vZGVsL0Rpc2suY3BwCisrKyBiL21vZGVsL0Rpc2suY3BwCkBAIC0xNSwzNiArMTUsMzYgQEAKICAqLwogCiAjaW5jbHVkZSAiRGlzay5oIgotI2luY2x1ZGUgIlB1YmxpY1ZvbHVtZS5oIgorI2luY2x1ZGUgIkZzQ3J5cHQuaCIKICNpbmNsdWRlICJQcml2YXRlVm9sdW1lLmgiCisjaW5jbHVkZSAiUHVibGljVm9sdW1lLmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2x1bWVCYXNlLmgiCiAjaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgotI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+Ci0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+CisjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CiAKICNpbmNsdWRlICJjcnlwdGZzLmgiCiAKLSNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+Ci0jaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewpAQCAtNzYsNiArNzYsOCBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja01tYyA9IDE3OTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga01ham9yQmxvY2tFeHBlcmltZW50YWxNaW4gPSAyNDA7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4ID0gMjU0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja0R5bmFtaWNNaW4gPSAyMzQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrRHluYW1pY01heCA9IDUxMjsKIAogc3RhdGljIGNvbnN0IGNoYXIqIGtHcHRCYXNpY0RhdGEgPSAiRUJEMEEwQTItQjlFNS00NDMzLTg3QzAtNjhCNkI3MjY5OUM3IjsKIHN0YXRpYyBjb25zdCBjaGFyKiBrR3B0QW5kcm9pZE1ldGEgPSAiMTlBNzEwQTItQjNDQS0xMUU0LUIwMjYtMTA2MDRCODg5RENGIjsKQEAgLTExMCwxNCArMTEyLDIyIEBACiAgICAgICogInJhbmNodSIsIHRoZSBkZXZpY2UncyBzeXNmcyBwYXRoIHNob3VsZCBlbmQgd2l0aCAiL2Jsb2NrL3ZkW2Qtel0iLCBldGMuCiAgICAgICogQnV0IGp1c3QgaGF2aW5nIGEpIGFuZCBiKSBpcyBlbm91Z2ggZm9yIG5vdy4KICAgICAgKi8KLSAgICByZXR1cm4gSXNSdW5uaW5nSW5FbXVsYXRvcigpICYmIG1ham9yID49IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluCi0gICAgICAgICAgICAmJiBtYWpvciA8PSBrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1heDsKKyAgICByZXR1cm4gSXNSdW5uaW5nSW5FbXVsYXRvcigpICYmIG1ham9yID49IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluICYmCisgICAgICAgICAgIG1ham9yIDw9IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4OwogfQogCi1EaXNrOjpEaXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFBhdGgsIGRldl90IGRldmljZSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5pY2tuYW1lLCBpbnQgZmxhZ3MpIDoKLSAgICAgICAgbURldmljZShkZXZpY2UpLCBtU2l6ZSgtMSksIG1OaWNrbmFtZShuaWNrbmFtZSksIG1GbGFncyhmbGFncyksIG1DcmVhdGVkKAotICAgICAgICAgICAgICAgIGZhbHNlKSwgbUp1c3RQYXJ0aXRpb25lZChmYWxzZSkgeworc3RhdGljIGJvb2wgaXNOdm1lQmxrRGV2aWNlKHVuc2lnbmVkIGludCBtYWpvciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5c1BhdGgpIHsKKyAgICByZXR1cm4gc3lzUGF0aC5maW5kKCJudm1lIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgbWFqb3IgPj0ga01ham9yQmxvY2tEeW5hbWljTWluICYmCisgICAgICAgICAgIG1ham9yIDw9IGtNYWpvckJsb2NrRHluYW1pY01heDsKK30KKworRGlzazo6RGlzayhjb25zdCBzdGQ6OnN0cmluZyYgZXZlbnRQYXRoLCBkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuaWNrbmFtZSwgaW50IGZsYWdzKQorICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgbVNpemUoLTEpLAorICAgICAgbU5pY2tuYW1lKG5pY2tuYW1lKSwKKyAgICAgIG1GbGFncyhmbGFncyksCisgICAgICBtQ3JlYXRlZChmYWxzZSksCisgICAgICBtSnVzdFBhcnRpdGlvbmVkKGZhbHNlKSB7CiAgICAgbUlkID0gU3RyaW5nUHJpbnRmKCJkaXNrOiV1LCV1IiwgbWFqb3IoZGV2aWNlKSwgbWlub3IoZGV2aWNlKSk7CiAgICAgbUV2ZW50UGF0aCA9IGV2ZW50UGF0aDsKICAgICBtU3lzUGF0aCA9IFN0cmluZ1ByaW50ZigiL3N5cy8lcyIsIGV2ZW50UGF0aC5jX3N0cigpKTsKQEAgLTIzMyw3MyArMjQzLDg0IEBACiAgICAgbVNpemUgPSAtMTsKICAgICBtTGFiZWwuY2xlYXIoKTsKIAotICAgIGludCBmZCA9IG9wZW4obURldlBhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwotICAgIGlmIChmZCAhPSAtMSkgewotICAgICAgICBpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkU2NCwgJm1TaXplKSkgewotICAgICAgICAgICAgbVNpemUgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBjbG9zZShmZCk7CisgICAgaWYgKEdldEJsb2NrRGV2U2l6ZShtRGV2UGF0aCwgJm1TaXplKSAhPSBPSykgeworICAgICAgICBtU2l6ZSA9IC0xOwogICAgIH0KIAogICAgIHVuc2lnbmVkIGludCBtYWpvcklkID0gbWFqb3IobURldmljZSk7CiAgICAgc3dpdGNoIChtYWpvcklkKSB7Ci0gICAgY2FzZSBrTWFqb3JCbG9ja0xvb3A6IHsKLSAgICAgICAgbUxhYmVsID0gIlZpcnR1YWwiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lBOiBjYXNlIGtNYWpvckJsb2NrU2NzaUI6IGNhc2Uga01ham9yQmxvY2tTY3NpQzogY2FzZSBrTWFqb3JCbG9ja1Njc2lEOgotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpRTogY2FzZSBrTWFqb3JCbG9ja1Njc2lGOiBjYXNlIGtNYWpvckJsb2NrU2NzaUc6IGNhc2Uga01ham9yQmxvY2tTY3NpSDoKLSAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUk6IGNhc2Uga01ham9yQmxvY2tTY3NpSjogY2FzZSBrTWFqb3JCbG9ja1Njc2lLOiBjYXNlIGtNYWpvckJsb2NrU2NzaUw6Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lNOiBjYXNlIGtNYWpvckJsb2NrU2NzaU46IGNhc2Uga01ham9yQmxvY2tTY3NpTzogY2FzZSBrTWFqb3JCbG9ja1Njc2lQOiB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS92ZW5kb3IiKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKLSAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIHZlbmRvciBmcm9tICIgPDwgcGF0aDsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gYW5kcm9pZDo6YmFzZTo6VHJpbSh0bXApOwotICAgICAgICBtTGFiZWwgPSB0bXA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS9tYW5maWQiKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKLSAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIG1hbnVmYWN0dXJlciBmcm9tICIgPDwgcGF0aDsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gYW5kcm9pZDo6YmFzZTo6VHJpbSh0bXApOwotICAgICAgICBpbnQ2NF90IG1hbmZpZDsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludCh0bXAsICZtYW5maWQpKSB7Ci0gICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcGFyc2UgbWFudWZhY3R1cmVyICIgPDwgdG1wOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT3VyIGdvYWwgaGVyZSBpcyB0byBnaXZlIHRoZSB1c2VyIGEgbWVhbmluZ2Z1bCBsYWJlbCwgaWRlYWxseQotICAgICAgICAvLyBtYXRjaGluZyB3aGF0ZXZlciBpcyBzaWxrLXNjcmVlbmVkIG9uIHRoZSBjYXJkLiAgVG8gcmVkdWNlCi0gICAgICAgIC8vIHVzZXIgY29uZnVzaW9uLCB0aGlzIGxpc3QgZG9lc24ndCBjb250YWluIHdoaXRlLWxhYmVsIG1hbmZpZC4KLSAgICAgICAgc3dpdGNoIChtYW5maWQpIHsKLSAgICAgICAgY2FzZSAweDAwMDAwMzogbUxhYmVsID0gIlNhbkRpc2siOyBicmVhazsKLSAgICAgICAgY2FzZSAweDAwMDAxYjogbUxhYmVsID0gIlNhbXN1bmciOyBicmVhazsKLSAgICAgICAgY2FzZSAweDAwMDAyODogbUxhYmVsID0gIkxleGFyIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgwMDAwNzQ6IG1MYWJlbCA9ICJUcmFuc2NlbmQiOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgICBpZiAoaXNWaXJ0aW9CbGtEZXZpY2UobWFqb3JJZCkpIHsKLSAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlJlY29nbml6ZWQgZXhwZXJpbWVudGFsIGJsb2NrIG1ham9yIElEICIgPDwgbWFqb3JJZAotICAgICAgICAgICAgICAgICAgICA8PCAiIGFzIHZpcnRpby1ibGsgKGVtdWxhdG9yJ3MgdmlydHVhbCBTRCBjYXJkIGRldmljZSkiOworICAgICAgICBjYXNlIGtNYWpvckJsb2NrTG9vcDogewogICAgICAgICAgICAgbUxhYmVsID0gIlZpcnR1YWwiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBibG9jayBtYWpvciB0eXBlICIgPDwgbWFqb3JJZDsKLSAgICAgICAgcmV0dXJuIC1FTk9UU1VQOwotICAgIH0KKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUE6IGNhc2Uga01ham9yQmxvY2tTY3NpQjogY2FzZSBrTWFqb3JCbG9ja1Njc2lDOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUQ6IGNhc2Uga01ham9yQmxvY2tTY3NpRTogY2FzZSBrTWFqb3JCbG9ja1Njc2lGOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUc6IGNhc2Uga01ham9yQmxvY2tTY3NpSDogY2FzZSBrTWFqb3JCbG9ja1Njc2lJOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUo6IGNhc2Uga01ham9yQmxvY2tTY3NpSzogY2FzZSBrTWFqb3JCbG9ja1Njc2lMOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaU06IGNhc2Uga01ham9yQmxvY2tTY3NpTjogY2FzZSBrTWFqb3JCbG9ja1Njc2lPOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaVA6IHsKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aChtU3lzUGF0aCArICIvZGV2aWNlL3ZlbmRvciIpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKHBhdGgsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHJlYWQgdmVuZG9yIGZyb20gIiA8PCBwYXRoOworICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAgPSBhbmRyb2lkOjpiYXNlOjpUcmltKHRtcCk7CisgICAgICAgICAgICBtTGFiZWwgPSB0bXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoKG1TeXNQYXRoICsgIi9kZXZpY2UvbWFuZmlkIik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0bXA7CisgICAgICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcmVhZCBtYW51ZmFjdHVyZXIgZnJvbSAiIDw8IHBhdGg7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcCA9IGFuZHJvaWQ6OmJhc2U6OlRyaW0odG1wKTsKKyAgICAgICAgICAgIGludDY0X3QgbWFuZmlkOworICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludCh0bXAsICZtYW5maWQpKSB7CisgICAgICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHBhcnNlIG1hbnVmYWN0dXJlciAiIDw8IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE91ciBnb2FsIGhlcmUgaXMgdG8gZ2l2ZSB0aGUgdXNlciBhIG1lYW5pbmdmdWwgbGFiZWwsIGlkZWFsbHkKKyAgICAgICAgICAgIC8vIG1hdGNoaW5nIHdoYXRldmVyIGlzIHNpbGstc2NyZWVuZWQgb24gdGhlIGNhcmQuICBUbyByZWR1Y2UKKyAgICAgICAgICAgIC8vIHVzZXIgY29uZnVzaW9uLCB0aGlzIGxpc3QgZG9lc24ndCBjb250YWluIHdoaXRlLWxhYmVsIG1hbmZpZC4KKyAgICAgICAgICAgIHN3aXRjaCAobWFuZmlkKSB7CisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICAgICAgICAgIGNhc2UgMHgwMDAwMDM6IG1MYWJlbCA9ICJTYW5EaXNrIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDAxYjogbUxhYmVsID0gIlNhbXN1bmciOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMDI4OiBtTGFiZWwgPSAiTGV4YXIiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMDc0OiBtTGFiZWwgPSAiVHJhbnNjZW5kIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgaWYgKGlzVmlydGlvQmxrRGV2aWNlKG1ham9ySWQpKSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiUmVjb2duaXplZCBleHBlcmltZW50YWwgYmxvY2sgbWFqb3IgSUQgIiA8PCBtYWpvcklkCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFzIHZpcnRpby1ibGsgKGVtdWxhdG9yJ3MgdmlydHVhbCBTRCBjYXJkIGRldmljZSkiOworICAgICAgICAgICAgICAgIG1MYWJlbCA9ICJWaXJ0dWFsIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc052bWVCbGtEZXZpY2UobWFqb3JJZCwgbVN5c1BhdGgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aChtU3lzUGF0aCArICIvZGV2aWNlL21vZGVsIik7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhwYXRoLCAmdG1wKSkgeworICAgICAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcmVhZCB2ZW5kb3IgZnJvbSAiIDw8IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1MYWJlbCA9IHRtcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgYmxvY2sgbWFqb3IgdHlwZSAiIDw8IG1ham9ySWQ7CisgICAgICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgICAgIH0KICAgICB9CiAKICAgICBhdXRvIGxpc3RlbmVyID0gVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+Z2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vbkRpc2tNZXRhZGF0YUNoYW5nZWQoZ2V0SWQoKSwKLSAgICAgICAgICAgIG1TaXplLCBtTGFiZWwsIG1TeXNQYXRoKTsKKyAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vbkRpc2tNZXRhZGF0YUNoYW5nZWQoZ2V0SWQoKSwgbVNpemUsIG1MYWJlbCwgbVN5c1BhdGgpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNTQ1LDM4ICs1NjYsNDkgQEAKICAgICAvLyBGaWd1cmUgb3V0IG1heGltdW0gcGFydGl0aW9uIGRldmljZXMgc3VwcG9ydGVkCiAgICAgdW5zaWduZWQgaW50IG1ham9ySWQgPSBtYWpvcihtRGV2aWNlKTsKICAgICBzd2l0Y2ggKG1ham9ySWQpIHsKLSAgICBjYXNlIGtNYWpvckJsb2NrTG9vcDogewotICAgICAgICBzdGQ6OnN0cmluZyB0bXA7Ci0gICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNMb29wTWF4TWlub3JzLCAmdG1wKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgbWF4IG1pbm9ycyI7Ci0gICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICBjYXNlIGtNYWpvckJsb2NrTG9vcDogeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKGtTeXNmc0xvb3BNYXhNaW5vcnMsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgbWF4IG1pbm9ycyI7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0b2kodG1wKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RkOjpzdG9pKHRtcCk7Ci0gICAgfQotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpQTogY2FzZSBrTWFqb3JCbG9ja1Njc2lCOiBjYXNlIGtNYWpvckJsb2NrU2NzaUM6IGNhc2Uga01ham9yQmxvY2tTY3NpRDoKLSAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUU6IGNhc2Uga01ham9yQmxvY2tTY3NpRjogY2FzZSBrTWFqb3JCbG9ja1Njc2lHOiBjYXNlIGtNYWpvckJsb2NrU2NzaUg6Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lJOiBjYXNlIGtNYWpvckJsb2NrU2NzaUo6IGNhc2Uga01ham9yQmxvY2tTY3NpSzogY2FzZSBrTWFqb3JCbG9ja1Njc2lMOgotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpTTogY2FzZSBrTWFqb3JCbG9ja1Njc2lOOiBjYXNlIGtNYWpvckJsb2NrU2NzaU86IGNhc2Uga01ham9yQmxvY2tTY3NpUDogewotICAgICAgICAvLyBQZXIgRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dCB0aGlzIGlzIHN0YXRpYwotICAgICAgICByZXR1cm4gMTU7Ci0gICAgfQotICAgIGNhc2Uga01ham9yQmxvY2tNbWM6IHsKLSAgICAgICAgLy8gUGVyIERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgdGhpcyBpcyBkeW5hbWljCi0gICAgICAgIHN0ZDo6c3RyaW5nIHRtcDsKLSAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKGtTeXNmc01tY01heE1pbm9ycywgJnRtcCkgJiYKLSAgICAgICAgICAgICAgICAhUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNNbWNNYXhNaW5vcnNEZXByZWNhdGVkLCAmdG1wKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgbWF4IG1pbm9ycyI7Ci0gICAgICAgICAgICByZXR1cm4gLWVycm5vOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGQ6OnN0b2kodG1wKTsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgICBpZiAoaXNWaXJ0aW9CbGtEZXZpY2UobWFqb3JJZCkpIHsKLSAgICAgICAgICAgIC8vIGRyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jIGhhcyAiI2RlZmluZSBQQVJUX0JJVFMgNCIsIHNvIG1heCBpcwotICAgICAgICAgICAgLy8gMl40IC0gMSA9IDE1CisgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lBOiBjYXNlIGtNYWpvckJsb2NrU2NzaUI6IGNhc2Uga01ham9yQmxvY2tTY3NpQzoKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lEOiBjYXNlIGtNYWpvckJsb2NrU2NzaUU6IGNhc2Uga01ham9yQmxvY2tTY3NpRjoKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lHOiBjYXNlIGtNYWpvckJsb2NrU2NzaUg6IGNhc2Uga01ham9yQmxvY2tTY3NpSToKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lKOiBjYXNlIGtNYWpvckJsb2NrU2NzaUs6IGNhc2Uga01ham9yQmxvY2tTY3NpTDoKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lNOiBjYXNlIGtNYWpvckJsb2NrU2NzaU46IGNhc2Uga01ham9yQmxvY2tTY3NpTzoKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lQOiB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgICAgICAgICAgIC8vIFBlciBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0IHRoaXMgaXMgc3RhdGljCiAgICAgICAgICAgICByZXR1cm4gMTU7CiAgICAgICAgIH0KLSAgICB9CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tNbWM6IHsKKyAgICAgICAgICAgIC8vIFBlciBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0IHRoaXMgaXMgZHluYW1pYworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKGtTeXNmc01tY01heE1pbm9ycywgJnRtcCkgJiYKKyAgICAgICAgICAgICAgICAhUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNNbWNNYXhNaW5vcnNEZXByZWNhdGVkLCAmdG1wKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIG1heCBtaW5vcnMiOworICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdG9pKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgaWYgKGlzVmlydGlvQmxrRGV2aWNlKG1ham9ySWQpKSB7CisgICAgICAgICAgICAgICAgLy8gZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMgaGFzICIjZGVmaW5lIFBBUlRfQklUUyA0Iiwgc28gbWF4IGlzCisgICAgICAgICAgICAgICAgLy8gMl40IC0gMSA9IDE1CisgICAgICAgICAgICAgICAgcmV0dXJuIDE1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzTnZtZUJsa0RldmljZShtYWpvcklkLCBtU3lzUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAvLyBkZXNwaXRlIGtlcm5lbCBudm1lIGRyaXZlciBzdXBwb3J0cyB1cCB0byAxTSBtaW5vcnMsCisgICAgICAgICAgICAgICAgLy8gICAgICNkZWZpbmUgTlZNRV9NSU5PUlMgKDFVIDw8IE1JTk9SQklUUykKKyAgICAgICAgICAgICAgICAvLyBzZ2Rpc2sgY2FuIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAxMjcgcGFydGl0aW9ucywgZHVlIHRvCisgICAgICAgICAgICAgICAgLy8gICAgICNkZWZpbmUgTUFYX01CUl9QQVJUUyAxMjgKKyAgICAgICAgICAgICAgICByZXR1cm4gMTI3OworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgYmxvY2sgbWFqb3IgdHlwZSAiIDw8IG1ham9ySWQ7CmRpZmYgLS1naXQgYS9tb2RlbC9EaXNrLmggYi9tb2RlbC9EaXNrLmgKaW5kZXggNjNhY2Y2YS4uMzE0MDE0NCAxMDA2NDQKLS0tIGEvbW9kZWwvRGlzay5oCisrKyBiL21vZGVsL0Rpc2suaApAQCAtMzYsNyArMzYsNyBAQAogICogaG93IHRvIHJlcGFydGl0aW9uIGl0c2VsZi4KICAqLwogY2xhc3MgRGlzayB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBEaXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFBhdGgsIGRldl90IGRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5pY2tuYW1lLCBpbnQgZmxhZ3MpOwogICAgIHZpcnR1YWwgfkRpc2soKTsKIApAQCAtNzksNyArNzksNyBAQAogICAgIHN0YXR1c190IHBhcnRpdGlvblByaXZhdGUoKTsKICAgICBzdGF0dXNfdCBwYXJ0aXRpb25NaXhlZChpbnQ4X3QgcmF0aW8pOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIC8qIElEIHRoYXQgdW5pcXVlbHkgcmVmZXJlbmNlcyB0aGlzIGRpc2sgKi8KICAgICBzdGQ6OnN0cmluZyBtSWQ7CiAgICAgLyogT3JpZ2luYWwgZXZlbnQgcGF0aCAqLwpkaWZmIC0tZ2l0IGEvbW9kZWwvRW11bGF0ZWRWb2x1bWUuY3BwIGIvbW9kZWwvRW11bGF0ZWRWb2x1bWUuY3BwCmluZGV4IDMxYzM5MjQuLjhkOWFjNzQgMTAwNjQ0Ci0tLSBhL21vZGVsL0VtdWxhdGVkVm9sdW1lLmNwcAorKysgYi9tb2RlbC9FbXVsYXRlZFZvbHVtZS5jcHAKQEAgLTI3LDggKzI3LDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CkBAIC0zOCwyMiArMzgsMjEgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIqIGtGdXNlUGF0aCA9ICIvc3lzdGVtL2Jpbi9zZGNhcmQiOwogCi1FbXVsYXRlZFZvbHVtZTo6RW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgpIDoKLSAgICAgICAgVm9sdW1lQmFzZShUeXBlOjprRW11bGF0ZWQpLCBtRnVzZVBpZCgwKSB7CitFbXVsYXRlZFZvbHVtZTo6RW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgpCisgICAgOiBWb2x1bWVCYXNlKFR5cGU6OmtFbXVsYXRlZCksIG1GdXNlUGlkKDApIHsKICAgICBzZXRJZCgiZW11bGF0ZWQiKTsKICAgICBtUmF3UGF0aCA9IHJhd1BhdGg7CiAgICAgbUxhYmVsID0gImVtdWxhdGVkIjsKIH0KIAotRW11bGF0ZWRWb2x1bWU6OkVtdWxhdGVkVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdQYXRoLCBkZXZfdCBkZXZpY2UsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1V1aWQpIDogVm9sdW1lQmFzZShUeXBlOjprRW11bGF0ZWQpLCBtRnVzZVBpZCgwKSB7CitFbXVsYXRlZFZvbHVtZTo6RW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgsIGRldl90IGRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCkKKyAgICA6IFZvbHVtZUJhc2UoVHlwZTo6a0VtdWxhdGVkKSwgbUZ1c2VQaWQoMCkgewogICAgIHNldElkKFN0cmluZ1ByaW50ZigiZW11bGF0ZWQ6JXUsJXUiLCBtYWpvcihkZXZpY2UpLCBtaW5vcihkZXZpY2UpKSk7CiAgICAgbVJhd1BhdGggPSByYXdQYXRoOwogICAgIG1MYWJlbCA9IGZzVXVpZDsKIH0KIAotRW11bGF0ZWRWb2x1bWU6On5FbXVsYXRlZFZvbHVtZSgpIHsKLX0KK0VtdWxhdGVkVm9sdW1lOjp+RW11bGF0ZWRWb2x1bWUoKSB7fQogCiBzdGF0dXNfdCBFbXVsYXRlZFZvbHVtZTo6ZG9Nb3VudCgpIHsKICAgICAvLyBXZSBjb3VsZCBoYXZlIG1pZ3JhdGVkIHN0b3JhZ2UgdG8gYW4gYWRvcHRlZCBwcml2YXRlIHZvbHVtZSwgc28gYWx3YXlzCkBAIC03MSw4ICs3MCw4IEBACiAgICAgc2V0UGF0aChTdHJpbmdQcmludGYoIi9zdG9yYWdlLyVzIiwgbGFiZWwuY19zdHIoKSkpOwogCiAgICAgaWYgKGZzX3ByZXBhcmVfZGlyKG1GdXNlRGVmYXVsdC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8Ci0gICAgICAgICAgICBmc19wcmVwYXJlX2RpcihtRnVzZVJlYWQuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSB8fAotICAgICAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VXcml0ZS5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpKSB7CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlUmVhZC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlV3JpdGUuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGNyZWF0ZSBtb3VudCBwb2ludHMiOwogICAgICAgICByZXR1cm4gLWVycm5vOwogICAgIH0KQEAgLTgwLDYgKzc5LDcgQEAKICAgICBkZXZfdCBiZWZvcmUgPSBHZXREZXZpY2UobUZ1c2VXcml0ZSk7CiAKICAgICBpZiAoIShtRnVzZVBpZCA9IGZvcmsoKSkpIHsKKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgICAgICBpZiAoZXhlY2woa0Z1c2VQYXRoLCBrRnVzZVBhdGgsCiAgICAgICAgICAgICAgICAgIi11IiwgIjEwMjMiLCAvLyBBSURfTUVESUFfUlcKICAgICAgICAgICAgICAgICAiLWciLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwpAQCAtOTAsNiArOTAsNyBAQAogICAgICAgICAgICAgICAgIG1SYXdQYXRoLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgbGFiZWwuY19zdHIoKSwKICAgICAgICAgICAgICAgICBOVUxMKSkgeworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV4ZWMiOwogICAgICAgICB9CiAKQEAgLTEwNCw4ICsxMDUsOCBAQAogCiAgICAgbnNlY3NfdCBzdGFydCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpOwogICAgIHdoaWxlIChiZWZvcmUgPT0gR2V0RGV2aWNlKG1GdXNlV3JpdGUpKSB7Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiV2FpdGluZyBmb3IgRlVTRSB0byBzcGluIHVwLi4uIjsKLSAgICAgICAgdXNsZWVwKDUwMDAwKTsgLy8gNTBtcworICAgICAgICBMT0coREVCVUcpIDw8ICJXYWl0aW5nIGZvciBGVVNFIHRvIHNwaW4gdXAuLi4iOworICAgICAgICB1c2xlZXAoNTAwMDApOyAgLy8gNTBtcwogCiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9CT09UVElNRSk7CiAgICAgICAgIGlmIChuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMobm93IC0gc3RhcnQpID4gNTAwMCkgewpAQCAtMTE0LDggKzExNSw4IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgLyogc2RjYXJkZnMgd2lsbCBoYXZlIGV4aXRlZCBhbHJlYWR5LiBGVVNFIHdpbGwgc3RpbGwgYmUgcnVubmluZyAqLwotICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChtRnVzZVBpZCwgbnVsbHB0ciwgV05PSEFORykpID09IG1GdXNlUGlkKQotICAgICAgICBtRnVzZVBpZCA9IDA7CisgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQobUZ1c2VQaWQsIG51bGxwdHIsIDApKTsKKyAgICBtRnVzZVBpZCA9IDA7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMzAsMTIgKzEzMSw2IEBACiAgICAgRm9yY2VVbm1vdW50KG1GdXNlUmVhZCk7CiAgICAgRm9yY2VVbm1vdW50KG1GdXNlV3JpdGUpOwogCi0gICAgaWYgKG1GdXNlUGlkID4gMCkgewotICAgICAgICBraWxsKG1GdXNlUGlkLCBTSUdURVJNKTsKLSAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQobUZ1c2VQaWQsIG51bGxwdHIsIDApKTsKLSAgICAgICAgbUZ1c2VQaWQgPSAwOwotICAgIH0KLQogICAgIHJtZGlyKG1GdXNlRGVmYXVsdC5jX3N0cigpKTsKICAgICBybWRpcihtRnVzZVJlYWQuY19zdHIoKSk7CiAgICAgcm1kaXIobUZ1c2VXcml0ZS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL21vZGVsL0VtdWxhdGVkVm9sdW1lLmggYi9tb2RlbC9FbXVsYXRlZFZvbHVtZS5oCmluZGV4IDliMGMwNDkuLmY2MThjNTUgMTAwNjQ0Ci0tLSBhL21vZGVsL0VtdWxhdGVkVm9sdW1lLmgKKysrIGIvbW9kZWwvRW11bGF0ZWRWb2x1bWUuaApAQCAtMzYsMTYgKzM2LDE2IEBACiAgKiBzdG9yZSBkYXRhIGxvY2FsIHRvIHRoZWlyIGFwcC4KICAqLwogY2xhc3MgRW11bGF0ZWRWb2x1bWUgOiBwdWJsaWMgVm9sdW1lQmFzZSB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBleHBsaWNpdCBFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCk7CiAgICAgRW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgsIGRldl90IGRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCk7CiAgICAgdmlydHVhbCB+RW11bGF0ZWRWb2x1bWUoKTsKIAotcHJvdGVjdGVkOgorICBwcm90ZWN0ZWQ6CiAgICAgc3RhdHVzX3QgZG9Nb3VudCgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvVW5tb3VudCgpIG92ZXJyaWRlOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIHN0ZDo6c3RyaW5nIG1SYXdQYXRoOwogICAgIHN0ZDo6c3RyaW5nIG1MYWJlbDsKIApkaWZmIC0tZ2l0IGEvbW9kZWwvT2JiVm9sdW1lLmNwcCBiL21vZGVsL09iYlZvbHVtZS5jcHAKaW5kZXggNzA5YzdhMy4uMjE0NzljNCAxMDA2NDQKLS0tIGEvbW9kZWwvT2JiVm9sdW1lLmNwcAorKysgYi9tb2RlbC9PYmJWb2x1bWUuY3BwCkBAIC0xNCwxNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJmcy9WZmF0LmgiCisjaW5jbHVkZSAiT2JiVm9sdW1lLmgiCiAjaW5jbHVkZSAiRGV2bWFwcGVyLmgiCiAjaW5jbHVkZSAiTG9vcC5oIgotI2luY2x1ZGUgIk9iYlZvbHVtZS5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCiAjaW5jbHVkZSAiVm9sZFV0aWwuaCIKKyNpbmNsdWRlICJmcy9WZmF0LmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKQEAgLTMxLDI2ICszMCwyNSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewogCiBPYmJWb2x1bWU6Ok9iYlZvbHVtZShpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LAotICAgICAgICBnaWRfdCBvd25lckdpZCkgOiBWb2x1bWVCYXNlKFR5cGU6OmtPYmIpIHsKKyAgICAgICAgICAgICAgICAgICAgIGdpZF90IG93bmVyR2lkKQorICAgIDogVm9sdW1lQmFzZShUeXBlOjprT2JiKSB7CiAgICAgc2V0SWQoU3RyaW5nUHJpbnRmKCJvYmI6JWQiLCBpZCkpOwogICAgIG1Tb3VyY2VQYXRoID0gc291cmNlUGF0aDsKICAgICBtU291cmNlS2V5ID0gc291cmNlS2V5OwogICAgIG1Pd25lckdpZCA9IG93bmVyR2lkOwogfQogCi1PYmJWb2x1bWU6On5PYmJWb2x1bWUoKSB7Ci19CitPYmJWb2x1bWU6On5PYmJWb2x1bWUoKSB7fQogCiBzdGF0dXNfdCBPYmJWb2x1bWU6OmRvQ3JlYXRlKCkgewogICAgIGlmIChMb29wOjpjcmVhdGUobVNvdXJjZVBhdGgsIG1Mb29wUGF0aCkpIHsKQEAgLTU5LDI0ICs1NywxNSBAQAogICAgIH0KIAogICAgIGlmICghbVNvdXJjZUtleS5lbXB0eSgpKSB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VjID0gMDsKLSAgICAgICAgewotICAgICAgICAgICAgdW5pcXVlX2ZkIGxvb3BfZmQob3BlbihtTG9vcFBhdGguY19zdHIoKSwgT19SRFdSIHwgT19DTE9FWEVDKSk7Ci0gICAgICAgICAgICBpZiAobG9vcF9mZC5nZXQoKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gb3BlbiBsb29wIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGdldF9ibGtkZXZfc2l6ZShsb29wX2ZkLmdldCgpLCAmbnJfc2VjKTsKLSAgICAgICAgICAgIGlmIChucl9zZWMgPT0gMCkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZ2V0IGxvb3Agc2l6ZSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQorICAgICAgICB1aW50NjRfdCBucl9zZWMgPSAwOworICAgICAgICBpZiAoR2V0QmxvY2tEZXY1MTJTZWN0b3JzKG1Mb29wUGF0aCwgJm5yX3NlYykgIT0gT0spIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZ2V0IGxvb3Agc2l6ZSI7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAogICAgICAgICBjaGFyIHRtcFtQQVRIX01BWF07Ci0gICAgICAgIGlmIChEZXZtYXBwZXI6OmNyZWF0ZShnZXRJZCgpLmNfc3RyKCksIG1Mb29wUGF0aC5jX3N0cigpLCBtU291cmNlS2V5LmNfc3RyKCksIG5yX3NlYywKLSAgICAgICAgICAgICAgICB0bXAsIFBBVEhfTUFYKSkgeworICAgICAgICBpZiAoRGV2bWFwcGVyOjpjcmVhdGUoZ2V0SWQoKS5jX3N0cigpLCBtTG9vcFBhdGguY19zdHIoKSwgbVNvdXJjZUtleS5jX3N0cigpLCBucl9zZWMsIHRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBVEhfTUFYKSkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBjcmVhdGUgZG0iOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC0xMDgsOCArOTcsMTAgQEAKICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBjcmVhdGUgbW91bnQgcG9pbnQiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChhbmRyb2lkOjp2b2xkOjp2ZmF0OjpNb3VudChtTW91bnRQYXRoLCBwYXRoLAotICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIHRydWUsIDAsIG1Pd25lckdpZCwgMDIyNywgZmFsc2UpKSB7CisgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgIGlmIChhbmRyb2lkOjp2b2xkOjp2ZmF0OjpNb3VudChtTW91bnRQYXRoLCBwYXRoLCB0cnVlLCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU93bmVyR2lkLCAwMjI3LCBmYWxzZSkpIHsKKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gbW91bnQiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbW9kZWwvT2JiVm9sdW1lLmggYi9tb2RlbC9PYmJWb2x1bWUuaAppbmRleCA1ZWMwY2RlLi44ZjdlZTk0IDEwMDY0NAotLS0gYS9tb2RlbC9PYmJWb2x1bWUuaAorKysgYi9tb2RlbC9PYmJWb2x1bWUuaApAQCAtMjgsMTggKzI4LDE3IEBACiAgKiBPQkIgY29udGFpbmVyLgogICovCiBjbGFzcyBPYmJWb2x1bWUgOiBwdWJsaWMgVm9sdW1lQmFzZSB7Ci1wdWJsaWM6Ci0gICAgT2JiVm9sdW1lKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VLZXksCi0gICAgICAgICAgICBnaWRfdCBvd25lckdpZCk7CisgIHB1YmxpYzoKKyAgICBPYmJWb2x1bWUoaW50IGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZUtleSwgZ2lkX3Qgb3duZXJHaWQpOwogICAgIHZpcnR1YWwgfk9iYlZvbHVtZSgpOwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb0NyZWF0ZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvRGVzdHJveSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvTW91bnQoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBkb1VubW91bnQoKSBvdmVycmlkZTsKIAotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICBzdGQ6OnN0cmluZyBtU291cmNlUGF0aDsKICAgICBzdGQ6OnN0cmluZyBtU291cmNlS2V5OwogICAgIGdpZF90IG1Pd25lckdpZDsKZGlmZiAtLWdpdCBhL21vZGVsL1ByaXZhdGVWb2x1bWUuY3BwIGIvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAKaW5kZXggY2YyMTU3Ny4uZGUyYTA5ZiAxMDA2NDQKLS0tIGEvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAKKysrIGIvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAKQEAgLTE0LDI3ICsxNCwyNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgImZzL0V4dDQuaCIKLSNpbmNsdWRlICJmcy9GMmZzLmgiCiAjaW5jbHVkZSAiUHJpdmF0ZVZvbHVtZS5oIgogI2luY2x1ZGUgIkVtdWxhdGVkVm9sdW1lLmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY3J5cHRmcy5oIgorI2luY2x1ZGUgImZzL0V4dDQuaCIKKyNpbmNsdWRlICJmcy9GMmZzLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogCkBAIC00MywxNCArNDMsMTMgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja01tYyA9IDE3OTsKIAotUHJpdmF0ZVZvbHVtZTo6UHJpdmF0ZVZvbHVtZShkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSYXcpIDoKLSAgICAgICAgVm9sdW1lQmFzZShUeXBlOjprUHJpdmF0ZSksIG1SYXdEZXZpY2UoZGV2aWNlKSwgbUtleVJhdyhrZXlSYXcpIHsKK1ByaXZhdGVWb2x1bWU6OlByaXZhdGVWb2x1bWUoZGV2X3QgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5UmF3KQorICAgIDogVm9sdW1lQmFzZShUeXBlOjprUHJpdmF0ZSksIG1SYXdEZXZpY2UoZGV2aWNlKSwgbUtleVJhdyhrZXlSYXcpIHsKICAgICBzZXRJZChTdHJpbmdQcmludGYoInByaXZhdGU6JXUsJXUiLCBtYWpvcihkZXZpY2UpLCBtaW5vcihkZXZpY2UpKSk7CiAgICAgbVJhd0RldlBhdGggPSBTdHJpbmdQcmludGYoIi9kZXYvYmxvY2svdm9sZC8lcyIsIGdldElkKCkuY19zdHIoKSk7CiB9CiAKLVByaXZhdGVWb2x1bWU6On5Qcml2YXRlVm9sdW1lKCkgewotfQorUHJpdmF0ZVZvbHVtZTo6flByaXZhdGVWb2x1bWUoKSB7fQogCiBzdGF0dXNfdCBQcml2YXRlVm9sdW1lOjpyZWFkTWV0YWRhdGEoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gUmVhZE1ldGFkYXRhKG1EbURldlBhdGgsICZtRnNUeXBlLCAmbUZzVXVpZCwgJm1Gc0xhYmVsKTsKQEAgLTY2LDkgKzY1LDkgQEAKICAgICAgICAgcmV0dXJuIC1FSU87CiAgICAgfQogICAgIGlmIChtS2V5UmF3LnNpemUoKSAhPSBjcnlwdGZzX2dldF9rZXlzaXplKCkpIHsKLSAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBSYXcga2V5c2l6ZSAiIDw8IG1LZXlSYXcuc2l6ZSgpIDw8Ci0gICAgICAgICAgIiBkb2VzIG5vdCBtYXRjaCBjcnlwdCBrZXlzaXplICIgPDwgY3J5cHRmc19nZXRfa2V5c2l6ZSgpOwotICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBSYXcga2V5c2l6ZSAiIDw8IG1LZXlSYXcuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgZG9lcyBub3QgbWF0Y2ggY3J5cHQga2V5c2l6ZSAiIDw8IGNyeXB0ZnNfZ2V0X2tleXNpemUoKTsKKyAgICAgICAgcmV0dXJuIC1FSU87CiAgICAgfQogCiAgICAgLy8gUmVjb3ZlciBmcm9tIHN0YWxlIHZvbGQgYnkgdGVhcmluZyBkb3duIGFueSBvbGQgbWFwcGluZ3MKQEAgLTc2LDEwICs3NSw5IEBACiAKICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGJldHRlciBTRUxpbnV4IGxhYmVscyBmb3IgcHJpdmF0ZSB2b2x1bWVzCiAKLSAgICB1bnNpZ25lZCBjaGFyKiBrZXkgPSAodW5zaWduZWQgY2hhciopIG1LZXlSYXcuZGF0YSgpOworICAgIHVuc2lnbmVkIGNoYXIqIGtleSA9ICh1bnNpZ25lZCBjaGFyKiltS2V5UmF3LmRhdGEoKTsKICAgICBjaGFyIGNyeXB0b19ibGtkZXZbTUFYUEFUSExFTl07Ci0gICAgaW50IHJlcyA9IGNyeXB0ZnNfc2V0dXBfZXh0X3ZvbHVtZShnZXRJZCgpLmNfc3RyKCksIG1SYXdEZXZQYXRoLmNfc3RyKCksCi0gICAgICAgICAgICBrZXksIGNyeXB0b19ibGtkZXYpOworICAgIGludCByZXMgPSBjcnlwdGZzX3NldHVwX2V4dF92b2x1bWUoZ2V0SWQoKS5jX3N0cigpLCBtUmF3RGV2UGF0aC5jX3N0cigpLCBrZXksIGNyeXB0b19ibGtkZXYpOwogICAgIG1EbURldlBhdGggPSBjcnlwdG9fYmxrZGV2OwogICAgIGlmIChyZXMgIT0gMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIHNldHVwIGNyeXB0ZnMiOwpAQCAtMTQ3LDEyICsxNDUsMTIgQEAKIAogICAgIC8vIFZlcmlmeSB0aGF0IGNvbW1vbiBkaXJlY3RvcmllcyBhcmUgcmVhZHkgdG8gcm9sbAogICAgIGlmIChQcmVwYXJlRGlyKG1QYXRoICsgIi9hcHAiLCAwNzcxLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSB8fAotICAgICAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvdXNlciIsIDA3MTEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi91c2VyX2RlIiwgMDcxMSwgQUlEX1NZU1RFTSwgQUlEX1NZU1RFTSkgfHwKLSAgICAgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhIiwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi9tZWRpYS8wIiwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi9sb2NhbCIsIDA3NTEsIEFJRF9ST09ULCBBSURfUk9PVCkgfHwKLSAgICAgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL2xvY2FsL3RtcCIsIDA3NzEsIEFJRF9TSEVMTCwgQUlEX1NIRUxMKSkgeworICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi91c2VyIiwgMDcxMSwgQUlEX1NZU1RFTSwgQUlEX1NZU1RFTSkgfHwKKyAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvdXNlcl9kZSIsIDA3MTEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pIHx8CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhIiwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpIHx8CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhLzAiLCAwNzcwLCBBSURfTUVESUFfUlcsIEFJRF9NRURJQV9SVykgfHwKKyAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvbG9jYWwiLCAwNzUxLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL2xvY2FsL3RtcCIsIDA3NzEsIEFJRF9TSEVMTCwgQUlEX1NIRUxMKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIHByZXBhcmUiOwogICAgICAgICByZXR1cm4gLUVJTzsKICAgICB9CkBAIC0xNjAsOCArMTU4LDcgQEAKICAgICAvLyBDcmVhdGUgYSBuZXcgZW11bGF0ZWQgdm9sdW1lIHN0YWNrZWQgYWJvdmUgdXMsIGl0IHdpbGwgYXV0b21hdGljYWxseQogICAgIC8vIGJlIGRlc3Ryb3llZCBkdXJpbmcgdW5tb3VudAogICAgIHN0ZDo6c3RyaW5nIG1lZGlhUGF0aChtUGF0aCArICIvbWVkaWEiKTsKLSAgICBhdXRvIHZvbCA9IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPigKLSAgICAgICAgICAgIG5ldyBFbXVsYXRlZFZvbHVtZShtZWRpYVBhdGgsIG1SYXdEZXZpY2UsIG1Gc1V1aWQpKTsKKyAgICBhdXRvIHZvbCA9IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPihuZXcgRW11bGF0ZWRWb2x1bWUobWVkaWFQYXRoLCBtUmF3RGV2aWNlLCBtRnNVdWlkKSk7CiAgICAgYWRkVm9sdW1lKHZvbCk7CiAgICAgdm9sLT5jcmVhdGUoKTsKIApkaWZmIC0tZ2l0IGEvbW9kZWwvUHJpdmF0ZVZvbHVtZS5oIGIvbW9kZWwvUHJpdmF0ZVZvbHVtZS5oCmluZGV4IDlhNjFmOGQuLjg1YWE0ZGMgMTAwNjQ0Ci0tLSBhL21vZGVsL1ByaXZhdGVWb2x1bWUuaAorKysgYi9tb2RlbC9Qcml2YXRlVm9sdW1lLmgKQEAgLTM2LDE0ICszNiwxNCBAQAogICoga2V5cyBhcmUgdGlnaHRseSB0aWVkIHRvIHRoaXMgZGV2aWNlLgogICovCiBjbGFzcyBQcml2YXRlVm9sdW1lIDogcHVibGljIFZvbHVtZUJhc2UgewotcHVibGljOgorICBwdWJsaWM6CiAgICAgUHJpdmF0ZVZvbHVtZShkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSYXcpOwogICAgIHZpcnR1YWwgflByaXZhdGVWb2x1bWUoKTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RnNUeXBlKCkgeyByZXR1cm4gbUZzVHlwZTsgfTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0UmF3RGV2UGF0aCgpIHsgcmV0dXJuIG1SYXdEZXZQYXRoOyB9OwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRSYXdEbURldlBhdGgoKSB7IHJldHVybiBtRG1EZXZQYXRoOyB9OwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb0NyZWF0ZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvRGVzdHJveSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvTW91bnQoKSBvdmVycmlkZTsKQEAgLTUyLDcgKzUyLDcgQEAKIAogICAgIHN0YXR1c190IHJlYWRNZXRhZGF0YSgpOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIC8qIEtlcm5lbCBkZXZpY2Ugb2YgcmF3LCBlbmNyeXB0ZWQgcGFydGl0aW9uICovCiAgICAgZGV2X3QgbVJhd0RldmljZTsKICAgICAvKiBQYXRoIHRvIHJhdywgZW5jcnlwdGVkIGJsb2NrIGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvbW9kZWwvUHVibGljVm9sdW1lLmNwcCBiL21vZGVsL1B1YmxpY1ZvbHVtZS5jcHAKaW5kZXggZmM3ZTk2Zi4uOGVkNDM1NiAxMDA2NDQKLS0tIGEvbW9kZWwvUHVibGljVm9sdW1lLmNwcAorKysgYi9tb2RlbC9QdWJsaWNWb2x1bWUuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSAiZnMvRXhmYXQuaCIKICNpbmNsdWRlICJmcy9WZmF0LmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CkBAIC0zMCw4ICszMCw4IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwpAQCAtNDMsMTQgKzQzLDEyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyKiBrQXNlY1BhdGggPSAiL21udC9zZWN1cmUvYXNlYyI7CiAKLVB1YmxpY1ZvbHVtZTo6UHVibGljVm9sdW1lKGRldl90IGRldmljZSkgOgotICAgICAgICBWb2x1bWVCYXNlKFR5cGU6OmtQdWJsaWMpLCBtRGV2aWNlKGRldmljZSksIG1GdXNlUGlkKDApIHsKK1B1YmxpY1ZvbHVtZTo6UHVibGljVm9sdW1lKGRldl90IGRldmljZSkgOiBWb2x1bWVCYXNlKFR5cGU6OmtQdWJsaWMpLCBtRGV2aWNlKGRldmljZSksIG1GdXNlUGlkKDApIHsKICAgICBzZXRJZChTdHJpbmdQcmludGYoInB1YmxpYzoldSwldSIsIG1ham9yKGRldmljZSksIG1pbm9yKGRldmljZSkpKTsKICAgICBtRGV2UGF0aCA9IFN0cmluZ1ByaW50ZigiL2Rldi9ibG9jay92b2xkLyVzIiwgZ2V0SWQoKS5jX3N0cigpKTsKIH0KIAotUHVibGljVm9sdW1lOjp+UHVibGljVm9sdW1lKCkgewotfQorUHVibGljVm9sdW1lOjp+UHVibGljVm9sdW1lKCkge30KIAogc3RhdHVzX3QgUHVibGljVm9sdW1lOjpyZWFkTWV0YWRhdGEoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gUmVhZE1ldGFkYXRhVW50cnVzdGVkKG1EZXZQYXRoLCAmbUZzVHlwZSwgJm1Gc1V1aWQsICZtRnNMYWJlbCk7CkBAIC02Niw4ICs2NCw3IEBACiAgICAgc3RkOjpzdHJpbmcgc2VjdXJlUGF0aChtUmF3UGF0aCArICIvLmFuZHJvaWRfc2VjdXJlIik7CiAKICAgICAvLyBSZWNvdmVyIGxlZ2FjeSBzZWN1cmUgcGF0aAotICAgIGlmICghYWNjZXNzKGxlZ2FjeVBhdGguY19zdHIoKSwgUl9PSyB8IFhfT0spCi0gICAgICAgICAgICAmJiBhY2Nlc3Moc2VjdXJlUGF0aC5jX3N0cigpLCBSX09LIHwgWF9PSykpIHsKKyAgICBpZiAoIWFjY2VzcyhsZWdhY3lQYXRoLmNfc3RyKCksIFJfT0sgfCBYX09LKSAmJiBhY2Nlc3Moc2VjdXJlUGF0aC5jX3N0cigpLCBSX09LIHwgWF9PSykpIHsKICAgICAgICAgaWYgKHJlbmFtZShsZWdhY3lQYXRoLmNfc3RyKCksIHNlY3VyZVBhdGguY19zdHIoKSkpIHsKICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byByZW5hbWUgbGVnYWN5IEFTRUMgZGlyIjsKICAgICAgICAgfQpAQCAtMTU4LDggKzE1NSw4IEBACiAgICAgfQogCiAgICAgaWYgKGZzX3ByZXBhcmVfZGlyKG1GdXNlRGVmYXVsdC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8Ci0gICAgICAgICAgICBmc19wcmVwYXJlX2RpcihtRnVzZVJlYWQuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSB8fAotICAgICAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VXcml0ZS5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpKSB7CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlUmVhZC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlV3JpdGUuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGNyZWF0ZSBGVVNFIG1vdW50IHBvaW50cyI7CiAgICAgICAgIHJldHVybiAtZXJybm87CiAgICAgfQpAQCAtMTY4LDYgKzE2NSw3IEBACiAKICAgICBpZiAoIShtRnVzZVBpZCA9IGZvcmsoKSkpIHsKICAgICAgICAgaWYgKGdldE1vdW50RmxhZ3MoKSAmIE1vdW50RmxhZ3M6OmtQcmltYXJ5KSB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgICAgICAgICBpZiAoZXhlY2woa0Z1c2VQYXRoLCBrRnVzZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgICItdSIsICIxMDIzIiwgLy8gQUlEX01FRElBX1JXCiAgICAgICAgICAgICAgICAgICAgICItZyIsICIxMDIzIiwgLy8gQUlEX01FRElBX1JXCkBAIC0xNzYsOSArMTc0LDExIEBACiAgICAgICAgICAgICAgICAgICAgIG1SYXdQYXRoLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIHN0YWJsZU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV4ZWMiOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgICAgICAgICAgaWYgKGV4ZWNsKGtGdXNlUGF0aCwga0Z1c2VQYXRoLAogICAgICAgICAgICAgICAgICAgICAiLXUiLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwogICAgICAgICAgICAgICAgICAgICAiLWciLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwpAQCAtMTg2LDYgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1SYXdQYXRoLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIHN0YWJsZU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV4ZWMiOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMDEsOCArMjAyLDggQEAKIAogICAgIG5zZWNzX3Qgc3RhcnQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKICAgICB3aGlsZSAoYmVmb3JlID09IEdldERldmljZShtRnVzZVdyaXRlKSkgewotICAgICAgICBMT0coVkVSQk9TRSkgPDwgIldhaXRpbmcgZm9yIEZVU0UgdG8gc3BpbiB1cC4uLiI7Ci0gICAgICAgIHVzbGVlcCg1MDAwMCk7IC8vIDUwbXMKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiV2FpdGluZyBmb3IgRlVTRSB0byBzcGluIHVwLi4uIjsKKyAgICAgICAgdXNsZWVwKDUwMDAwKTsgIC8vIDUwbXMKIAogICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpOwogICAgICAgICBpZiAobmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKG5vdyAtIHN0YXJ0KSA+IDUwMDApIHsKQEAgLTIxMSw4ICsyMTIsOCBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8qIHNkY2FyZGZzIHdpbGwgaGF2ZSBleGl0ZWQgYWxyZWFkeS4gRlVTRSB3aWxsIHN0aWxsIGJlIHJ1bm5pbmcgKi8KLSAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQobUZ1c2VQaWQsIG51bGxwdHIsIFdOT0hBTkcpKSA9PSBtRnVzZVBpZCkKLSAgICAgICAgbUZ1c2VQaWQgPSAwOworICAgIFRFTVBfRkFJTFVSRV9SRVRSWSh3YWl0cGlkKG1GdXNlUGlkLCBudWxscHRyLCAwKSk7CisgICAgbUZ1c2VQaWQgPSAwOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjMxLDEyICsyMzIsNiBAQAogICAgIEZvcmNlVW5tb3VudChtRnVzZVdyaXRlKTsKICAgICBGb3JjZVVubW91bnQobVJhd1BhdGgpOwogCi0gICAgaWYgKG1GdXNlUGlkID4gMCkgewotICAgICAgICBraWxsKG1GdXNlUGlkLCBTSUdURVJNKTsKLSAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQobUZ1c2VQaWQsIG51bGxwdHIsIDApKTsKLSAgICAgICAgbUZ1c2VQaWQgPSAwOwotICAgIH0KLQogICAgIHJtZGlyKG1GdXNlRGVmYXVsdC5jX3N0cigpKTsKICAgICBybWRpcihtRnVzZVJlYWQuY19zdHIoKSk7CiAgICAgcm1kaXIobUZ1c2VXcml0ZS5jX3N0cigpKTsKQEAgLTI1MSwyOCArMjQ2LDUzIEBACiB9CiAKIHN0YXR1c190IFB1YmxpY1ZvbHVtZTo6ZG9Gb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSkgewotICAgIGlmICgoZnNUeXBlID09ICJ2ZmF0IiB8fCBmc1R5cGUgPT0gImF1dG8iKSAmJiB2ZmF0OjpJc1N1cHBvcnRlZCgpKSB7Ci0gICAgICAgIGlmIChXaXBlQmxvY2tEZXZpY2UobURldlBhdGgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byB3aXBlIjsKKyAgICBib29sIHVzZVZmYXQgPSB2ZmF0OjpJc1N1cHBvcnRlZCgpOworICAgIGJvb2wgdXNlRXhmYXQgPSBleGZhdDo6SXNTdXBwb3J0ZWQoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIFJlc29sdmUgdGhlIHRhcmdldCBmaWxlc3lzdGVtIHR5cGUKKyAgICBpZiAoZnNUeXBlID09ICJhdXRvIiAmJiB1c2VWZmF0ICYmIHVzZUV4ZmF0KSB7CisgICAgICAgIHVpbnQ2NF90IHNpemUgPSAwOworCisgICAgICAgIHJlcyA9IEdldEJsb2NrRGV2U2l6ZShtRGV2UGF0aCwgJnNpemUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZG4ndCBnZXQgZGV2aWNlIHNpemUgIiA8PCBtRGV2UGF0aDsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHZmYXQ6OkZvcm1hdChtRGV2UGF0aCwgMCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBmb3JtYXQiOwotICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICAvLyBJZiBib3RoIHZmYXQgJiBleGZhdCBhcmUgc3VwcG9ydGVkIHVzZSBleGZhdCBmb3IgU0RYQyAoPn4zMkdpQikgY2FyZHMKKyAgICAgICAgaWYgKHNpemUgPiAzMjg5NkxMICogMTAyNCAqIDEwMjQpIHsKKyAgICAgICAgICAgIHVzZVZmYXQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZUV4ZmF0ID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKChmc1R5cGUgPT0gImV4ZmF0IiB8fCBmc1R5cGUgPT0gImF1dG8iKSAmJiBleGZhdDo6SXNTdXBwb3J0ZWQoKSkgewotICAgICAgICBpZiAoV2lwZUJsb2NrRGV2aWNlKG1EZXZQYXRoKSAhPSBPSykgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gd2lwZSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4ZmF0OjpGb3JtYXQobURldlBhdGgpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZm9ybWF0IjsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoZnNUeXBlID09ICJ2ZmF0IikgeworICAgICAgICB1c2VFeGZhdCA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoZnNUeXBlID09ICJleGZhdCIpIHsKKyAgICAgICAgdXNlVmZhdCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghdXNlVmZhdCAmJiAhdXNlRXhmYXQpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgZmlsZXN5c3RlbSAiIDw8IGZzVHlwZTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIGlmIChXaXBlQmxvY2tEZXZpY2UobURldlBhdGgpICE9IE9LKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIHdpcGUiOworICAgIH0KKworICAgIGlmICh1c2VWZmF0KSB7CisgICAgICAgIHJlcyA9IHZmYXQ6OkZvcm1hdChtRGV2UGF0aCwgMCk7CisgICAgfSBlbHNlIGlmICh1c2VFeGZhdCkgeworICAgICAgICByZXMgPSBleGZhdDo6Rm9ybWF0KG1EZXZQYXRoKTsKKyAgICB9CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBmb3JtYXQiOworICAgICAgICByZXMgPSAtZXJybm87CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKZGlmZiAtLWdpdCBhL21vZGVsL1B1YmxpY1ZvbHVtZS5oIGIvbW9kZWwvUHVibGljVm9sdW1lLmgKaW5kZXggM2FhN2E3My4uYzkxOGY1MiAxMDA2NDQKLS0tIGEvbW9kZWwvUHVibGljVm9sdW1lLmgKKysrIGIvbW9kZWwvUHVibGljVm9sdW1lLmgKQEAgLTM4LDExICszOCwxMSBAQAogICogYXdheSB0aGUgQW5kcm9pZCBkaXJlY3RvcnkgZm9yIHNlY29uZGFyeSB1c2Vycy4KICAqLwogY2xhc3MgUHVibGljVm9sdW1lIDogcHVibGljIFZvbHVtZUJhc2UgewotcHVibGljOgorICBwdWJsaWM6CiAgICAgZXhwbGljaXQgUHVibGljVm9sdW1lKGRldl90IGRldmljZSk7CiAgICAgdmlydHVhbCB+UHVibGljVm9sdW1lKCk7CiAKLXByb3RlY3RlZDoKKyAgcHJvdGVjdGVkOgogICAgIHN0YXR1c190IGRvQ3JlYXRlKCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZG9EZXN0cm95KCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZG9Nb3VudCgpIG92ZXJyaWRlOwpAQCAtNTIsNyArNTIsNyBAQAogICAgIHN0YXR1c190IHJlYWRNZXRhZGF0YSgpOwogICAgIHN0YXR1c190IGluaXRBc2VjU3RhZ2UoKTsKIAotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICAvKiBLZXJuZWwgZGV2aWNlIHJlcHJlc2VudGluZyBwYXJ0aXRpb24gKi8KICAgICBkZXZfdCBtRGV2aWNlOwogICAgIC8qIEJsb2NrIGRldmljZSBwYXRoICovCmRpZmYgLS1naXQgYS9tb2RlbC9TdHViVm9sdW1lLmNwcCBiL21vZGVsL1N0dWJWb2x1bWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDA4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RlbC9TdHViVm9sdW1lLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlN0dWJWb2x1bWUuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB2b2xkIHsKKworU3R1YlZvbHVtZTo6U3R1YlZvbHVtZShpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNMYWJlbCkKKyAgICA6IFZvbHVtZUJhc2UoVHlwZTo6a1N0dWIpLAorICAgICAgbVNvdXJjZVBhdGgoc291cmNlUGF0aCksCisgICAgICBtTW91bnRQYXRoKG1vdW50UGF0aCksCisgICAgICBtRnNUeXBlKGZzVHlwZSksCisgICAgICBtRnNVdWlkKGZzVXVpZCksCisgICAgICBtRnNMYWJlbChmc0xhYmVsKSB7CisgICAgc2V0SWQoU3RyaW5nUHJpbnRmKCJzdHViOiVkIiwgaWQpKTsKK30KKworU3R1YlZvbHVtZTo6flN0dWJWb2x1bWUoKSB7fQorCitzdGF0dXNfdCBTdHViVm9sdW1lOjpkb0NyZWF0ZSgpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0dWJWb2x1bWU6OmRvRGVzdHJveSgpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0dWJWb2x1bWU6OmRvTW91bnQoKSB7CisgICAgYXV0byBsaXN0ZW5lciA9IGdldExpc3RlbmVyKCk7CisgICAgaWYgKGxpc3RlbmVyKSBsaXN0ZW5lci0+b25Wb2x1bWVNZXRhZGF0YUNoYW5nZWQoZ2V0SWQoKSwgbUZzVHlwZSwgbUZzVXVpZCwgbUZzTGFiZWwpOworICAgIHNldEludGVybmFsUGF0aChtU291cmNlUGF0aCk7CisgICAgc2V0UGF0aChtTW91bnRQYXRoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0dWJWb2x1bWU6OmRvVW5tb3VudCgpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRPRE86IHJldHVybiBlcnJvciBpbnN0ZWFkLgorc3RhdHVzX3QgU3R1YlZvbHVtZTo6ZG9Gb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSkgeworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIHZvbGQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tb2RlbC9TdHViVm9sdW1lLmggYi9tb2RlbC9TdHViVm9sdW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4Y2FlOQotLS0gL2Rldi9udWxsCisrKyBiL21vZGVsL1N0dWJWb2x1bWUuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1ZPTERfU1RVQl9WT0xVTUVfSAorI2RlZmluZSBBTkRST0lEX1ZPTERfU1RVQl9WT0xVTUVfSAorCisjaW5jbHVkZSAiVm9sdW1lQmFzZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugdm9sZCB7CisKKy8qCisgKiBBIHZvbGQgcmVwcmVzZW50YXRpb24gb2Ygdm9sdW1lcyBtYW5hZ2VkIGZyb20gb3V0c2lkZSBBbmRyb2lkIChlLmcuLCBBUkMrKykuCisgKgorICogVXNlZCBmb3IgdGhlIGNhc2Ugd2hlbiBldmVudHMgc3VjaCB0aGF0IG1vdW50aW5nIGFuZCB1bm1vdW50aW5nIGFyZQorICogYWN0dWFsbHkgaGFuZGxlZCBmcm9tIG91dHNpZGUgdm9sZCwgYW5kIHZvbGQgb25seSBuZWVkIHRvIGtlZXAgdHJhY2sgb24gdGhvc2UKKyAqIHZlbnRzIGluc3RlYWQgb2YgdGFsa2luZyB0byBrZXJuZWwgZGlyZWN0bHkuCisgKi8KK2NsYXNzIFN0dWJWb2x1bWUgOiBwdWJsaWMgVm9sdW1lQmFzZSB7CisgIHB1YmxpYzoKKyAgICBTdHViVm9sdW1lKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudFBhdGgsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNMYWJlbCk7CisgICAgdmlydHVhbCB+U3R1YlZvbHVtZSgpOworCisgIHByb3RlY3RlZDoKKyAgICBzdGF0dXNfdCBkb0NyZWF0ZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGRvRGVzdHJveSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGRvTW91bnQoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkb1VubW91bnQoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkb0Zvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgZnNUeXBlKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Tb3VyY2VQYXRoOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Nb3VudFBhdGg7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbUZzVHlwZTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtRnNVdWlkOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Gc0xhYmVsOworCisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN0dWJWb2x1bWUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHZvbGQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbW9kZWwvVm9sdW1lQmFzZS5jcHAgYi9tb2RlbC9Wb2x1bWVCYXNlLmNwcAppbmRleCA0MjlmMTM0Li4zMDBhZGQxIDEwMDY0NAotLS0gYS9tb2RlbC9Wb2x1bWVCYXNlLmNwcAorKysgYi9tb2RlbC9Wb2x1bWVCYXNlLmNwcApAQCAtMTQsMTIgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2x1bWVCYXNlLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzIsMTAgKzMyLDEzIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CiAKLVZvbHVtZUJhc2U6OlZvbHVtZUJhc2UoVHlwZSB0eXBlKSA6Ci0gICAgICAgIG1UeXBlKHR5cGUpLCBtTW91bnRGbGFncygwKSwgbU1vdW50VXNlcklkKC0xKSwgbUNyZWF0ZWQoZmFsc2UpLCBtU3RhdGUoCi0gICAgICAgICAgICAgICAgU3RhdGU6OmtVbm1vdW50ZWQpLCBtU2lsZW50KGZhbHNlKSB7Ci19CitWb2x1bWVCYXNlOjpWb2x1bWVCYXNlKFR5cGUgdHlwZSkKKyAgICA6IG1UeXBlKHR5cGUpLAorICAgICAgbU1vdW50RmxhZ3MoMCksCisgICAgICBtTW91bnRVc2VySWQoLTEpLAorICAgICAgbUNyZWF0ZWQoZmFsc2UpLAorICAgICAgbVN0YXRlKFN0YXRlOjprVW5tb3VudGVkKSwKKyAgICAgIG1TaWxlbnQoZmFsc2UpIHt9CiAKIFZvbHVtZUJhc2U6On5Wb2x1bWVCYXNlKCkgewogICAgIENIRUNLKCFtQ3JlYXRlZCk7CkBAIC00NSw3ICs0OCw5IEBACiAgICAgbVN0YXRlID0gc3RhdGU7CiAKICAgICBhdXRvIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vblZvbHVtZVN0YXRlQ2hhbmdlZChnZXRJZCgpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihtU3RhdGUpKTsKKyAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uVm9sdW1lU3RhdGVDaGFuZ2VkKGdldElkKCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdGF0ZSkpOworICAgIH0KIH0KIAogc3RhdHVzX3QgVm9sdW1lQmFzZTo6c2V0RGlza0lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXNrSWQpIHsKQEAgLTEzMSw3ICsxMzYsOSBAQAogICAgIG1JbnRlcm5hbFBhdGggPSBpbnRlcm5hbFBhdGg7CiAKICAgICBhdXRvIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vblZvbHVtZUludGVybmFsUGF0aENoYW5nZWQoZ2V0SWQoKSwgbUludGVybmFsUGF0aCk7CisgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgIGxpc3RlbmVyLT5vblZvbHVtZUludGVybmFsUGF0aENoYW5nZWQoZ2V0SWQoKSwgbUludGVybmFsUGF0aCk7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTY4LDggKzE3NSw5IEBACiAgICAgc3RhdHVzX3QgcmVzID0gZG9DcmVhdGUoKTsKIAogICAgIGF1dG8gbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXItPm9uVm9sdW1lQ3JlYXRlZChnZXRJZCgpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obVR5cGUpLCBtRGlza0lkLCBtUGFydEd1aWQpOworICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICBsaXN0ZW5lci0+b25Wb2x1bWVDcmVhdGVkKGdldElkKCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1UeXBlKSwgbURpc2tJZCwgbVBhcnRHdWlkKTsKKyAgICB9CiAKICAgICBzZXRTdGF0ZShTdGF0ZTo6a1VubW91bnRlZCk7CiAgICAgcmV0dXJuIHJlczsKQEAgLTE4OSw5ICsxOTcsMTAgQEAKICAgICAgICAgc2V0U3RhdGUoU3RhdGU6OmtSZW1vdmVkKTsKICAgICB9CiAKLQogICAgIGF1dG8gbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXItPm9uVm9sdW1lRGVzdHJveWVkKGdldElkKCkpOworICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICBsaXN0ZW5lci0+b25Wb2x1bWVEZXN0cm95ZWQoZ2V0SWQoKSk7CisgICAgfQogCiAgICAgc3RhdHVzX3QgcmVzID0gZG9EZXN0cm95KCk7CiAgICAgbUNyZWF0ZWQgPSBmYWxzZTsKQEAgLTIyOCw4ICsyMzcsNyBAQAogICAgIHNldFN0YXRlKFN0YXRlOjprRWplY3RpbmcpOwogICAgIGZvciAoY29uc3QgYXV0byYgdm9sIDogbVZvbHVtZXMpIHsKICAgICAgICAgaWYgKHZvbC0+ZGVzdHJveSgpKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBkZXN0cm95ICIgPDwgdm9sLT5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgc3RhY2tlZCBhYm92ZSI7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBkZXN0cm95ICIgPDwgdm9sLT5nZXRJZCgpIDw8ICIgc3RhY2tlZCBhYm92ZSI7CiAgICAgICAgIH0KICAgICB9CiAgICAgbVZvbHVtZXMuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL21vZGVsL1ZvbHVtZUJhc2UuaCBiL21vZGVsL1ZvbHVtZUJhc2UuaAppbmRleCA0YWE4YjAyLi45MmE4M2YwIDEwMDY0NAotLS0gYS9tb2RlbC9Wb2x1bWVCYXNlLmgKKysrIGIvbW9kZWwvVm9sdW1lQmFzZS5oCkBAIC0xNyw4ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfVk9MRF9WT0xVTUVfQkFTRV9ICiAjZGVmaW5lIEFORFJPSURfVk9MRF9WT0xVTUVfQkFTRV9ICiAKLSNpbmNsdWRlICJhbmRyb2lkL29zL0lWb2xkTGlzdGVuZXIuaCIKICNpbmNsdWRlICJVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3MvSVZvbGRMaXN0ZW5lci5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNDUsNyArNDUsNyBAQAogICogdm9sdW1lcyBhbmQgcmVtb3ZlcyBhbnkgYmluZCBtb3VudHMgYmVmb3JlIGZpbmFsbHkgdW5tb3VudGluZyBpdHNlbGYuCiAgKi8KIGNsYXNzIFZvbHVtZUJhc2UgewotcHVibGljOgorICBwdWJsaWM6CiAgICAgdmlydHVhbCB+Vm9sdW1lQmFzZSgpOwogCiAgICAgZW51bSBjbGFzcyBUeXBlIHsKQEAgLTU0LDYgKzU0LDcgQEAKICAgICAgICAga0VtdWxhdGVkLAogICAgICAgICBrQXNlYywKICAgICAgICAga09iYiwKKyAgICAgICAga1N0dWIsCiAgICAgfTsKIAogICAgIGVudW0gTW91bnRGbGFncyB7CkBAIC0xMDIsNyArMTAzLDcgQEAKICAgICBzdGF0dXNfdCB1bm1vdW50KCk7CiAgICAgc3RhdHVzX3QgZm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1R5cGUpOwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBleHBsaWNpdCBWb2x1bWVCYXNlKFR5cGUgdHlwZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRvQ3JlYXRlKCk7CkBAIC0xMTcsNyArMTE4LDcgQEAKIAogICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZExpc3RlbmVyPiBnZXRMaXN0ZW5lcigpOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIC8qIElEIHRoYXQgdW5pcXVlbHkgcmVmZXJlbmNlcyB2b2x1bWUgd2hpbGUgYWxpdmUgKi8KICAgICBzdGQ6OnN0cmluZyBtSWQ7CiAgICAgLyogSUQgdGhhdCB1bmlxdWVseSByZWZlcmVuY2VzIHBhcmVudCBkaXNrIHdoaWxlIGFsaXZlICovCmRpZmYgLS1naXQgYS9zZWNkaXNjYXJkLmNwcCBiL3NlY2Rpc2NhcmQuY3BwCmluZGV4IGY5NTMyZWEuLjJkOWRjMzUgMTAwNjQ0Ci0tLSBhL3NlY2Rpc2NhcmQuY3BwCisrKyBiL3NlY2Rpc2NhcmQuY3BwCkBAIC0xOCwxNSArMTgsMTUgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bW50ZW50Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgotI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CkBAIC00MiwyMiArNDIsNDcgQEAKIAogY29uc3RleHByIHVpbnQzMl90IG1heF9leHRlbnRzID0gMzI7CiAKLWJvb2wgcmVhZF9jb21tYW5kX2xpbmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBjb25zdCBhcmd2W10sIE9wdGlvbnMgJm9wdGlvbnMpOwotdm9pZCB1c2FnZShjb25zdCBjaGFyICpwcm9nbmFtZSk7Ci1ib29sIHNlY2Rpc2NhcmRfcGF0aChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCk7Ci1ib29sIGNoZWNrX2ZpZW1hcChjb25zdCBzdHJ1Y3QgZmllbWFwICZmaWVtYXAsIGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKTsKK2Jvb2wgcmVhZF9jb21tYW5kX2xpbmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSwgT3B0aW9ucyYgb3B0aW9ucyk7Cit2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIHByb2duYW1lKTsKK2Jvb2wgc2VjZGlzY2FyZF9wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKK2Jvb2wgY2hlY2tfZmllbWFwKGNvbnN0IHN0cnVjdCBmaWVtYXAmIGZpZW1hcCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwogYm9vbCBvdmVyd3JpdGVfd2l0aF96ZXJvcyhpbnQgZmQsIG9mZjY0X3Qgc3RhcnQsIG9mZjY0X3QgbGVuZ3RoKTsKIAotfQorfSAgLy8gbmFtZXNwYWNlCiAKLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgYXJndltdKSB7Ci0gICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoY29uc3RfY2FzdDxjaGFyICoqPihhcmd2KSk7CitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKSB7CisgICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoY29uc3RfY2FzdDxjaGFyKio+KGFyZ3YpKTsKICAgICBPcHRpb25zIG9wdGlvbnM7CiAgICAgaWYgKCFyZWFkX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBvcHRpb25zKSkgewogICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBmb3IgKGF1dG8gY29uc3QgJnRhcmdldDogb3B0aW9ucy50YXJnZXRzKSB7CisKKyAgICBmb3IgKGF1dG8gY29uc3QmIHRhcmdldCA6IG9wdGlvbnMudGFyZ2V0cykgeworLy8gRjJGUy1zcGVjaWZpYyBpb2N0bAorLy8gSXQgcmVxdWlyZXMgdGhlIGJlbG93IGtlcm5lbCBjb21taXQgbWVyZ2VkIGluIHY0LjE2LXJjMS4KKy8vICAgMWFkNzFhMjcxMjRjICgiZjJmczogYWRkIGFuIGlvY3RsIHRvIGRpc2FibGUgR0MgZm9yIHNwZWNpZmljIGZpbGUiKQorLy8gSW4gYW5kcm9pZC00LjQsCisvLyAgIDU2ZWUxZTgxNzkwOCAoImYyZnM6IHVwZGF0ZXMgb24gdjQuMTYtcmMxIikKKy8vIEluIGFuZHJvaWQtNC45LAorLy8gICAyZjE3ZTM0NjcyYTggKCJmMmZzOiB1cGRhdGVzIG9uIHY0LjE2LXJjMSIpCisvLyBJbiBhbmRyb2lkLTQuMTQsCisvLyAgIGNlNzY3ZDlhNTViYyAoImYyZnM6IHVwZGF0ZXMgb24gdjQuMTYtcmMxIikKKyNpZm5kZWYgRjJGU19JT0NfU0VUX1BJTl9GSUxFCisjaWZuZGVmIEYyRlNfSU9DVExfTUFHSUMKKyNkZWZpbmUgRjJGU19JT0NUTF9NQUdJQyAweGY1CisjZW5kaWYKKyNkZWZpbmUgRjJGU19JT0NfU0VUX1BJTl9GSUxFIF9JT1coRjJGU19JT0NUTF9NQUdJQywgMTMsIF9fdTMyKQorI2RlZmluZSBGMkZTX0lPQ19HRVRfUElOX0ZJTEUgX0lPUihGMkZTX0lPQ1RMX01BR0lDLCAxNCwgX191MzIpCisjZW5kaWYKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHRhcmdldC5jX3N0cigpLCBPX1dST05MWSwgMCkpKTsKKyAgICAgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTZWN1cmUgZGlzY2FyZCBvcGVuIGZhaWxlZCBmb3I6ICIgPDwgdGFyZ2V0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgX191MzIgc2V0ID0gMTsKKyAgICAgICAgaW9jdGwoZmQsIEYyRlNfSU9DX1NFVF9QSU5fRklMRSwgJnNldCk7CisKICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2VjdXJlbHkgZGlzY2FyZGluZyAnIiA8PCB0YXJnZXQgPDwgIicgdW5saW5rPSIgPDwgb3B0aW9ucy51bmxpbms7CiAgICAgICAgIGlmICghc2VjZGlzY2FyZF9wYXRoKHRhcmdldCkpIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlNlY3VyZSBkaXNjYXJkIGZhaWxlZCBmb3I6ICIgPDwgdGFyZ2V0OwpAQCAtNjcsNiArOTIsOCBAQAogICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gdW5saW5rOiAiIDw8IHRhcmdldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBzZXQgPSAwOworICAgICAgICBpb2N0bChmZCwgRjJGU19JT0NfU0VUX1BJTl9GSUxFLCAmc2V0KTsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiRGlzY2FyZGVkOiAiIDw8IHRhcmdldDsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC03NCwyOSArMTAxLDI5IEBACiAKIG5hbWVzcGFjZSB7CiAKLWJvb2wgcmVhZF9jb21tYW5kX2xpbmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBjb25zdCBhcmd2W10sIE9wdGlvbnMgJm9wdGlvbnMpIHsKK2Jvb2wgcmVhZF9jb21tYW5kX2xpbmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSwgT3B0aW9ucyYgb3B0aW9ucykgewogICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgIGlmICghc3RyY21wKCItLW5vLXVubGluayIsIGFyZ3ZbaV0pKSB7CiAgICAgICAgICAgICBvcHRpb25zLnVubGluayA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tIiwgYXJndltpXSkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBpKzE7IGogPCBhcmdjOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJndltqXVswXSAhPSAnLycpIHJldHVybiBmYWxzZTsgLy8gTXVzdCBiZSBhYnNvbHV0ZSBwYXRoCisgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBhcmdjOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJndltqXVswXSAhPSAnLycpIHJldHVybiBmYWxzZTsgIC8vIE11c3QgYmUgYWJzb2x1dGUgcGF0aAogICAgICAgICAgICAgICAgIG9wdGlvbnMudGFyZ2V0cy5lbXBsYWNlX2JhY2soYXJndltqXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy50YXJnZXRzLnNpemUoKSA+IDA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFVua25vd24gb3B0aW9uCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBVbmtub3duIG9wdGlvbgogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsgLy8gIi0tIiBub3QgZm91bmQKKyAgICByZXR1cm4gZmFsc2U7ICAvLyAiLS0iIG5vdCBmb3VuZAogfQogCi12b2lkIHVzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKSB7Cit2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIHByb2duYW1lKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy0tbm8tdW5saW5rXSAtLSA8YWJzb2x1dGUgcGF0aD4gLi4uXG4iLCBwcm9nbmFtZSk7CiB9CiAKIC8vIEJMS1NFQ0RJU0NBUkQgYWxsIGNvbnRlbnQgaW4gInBhdGgiLCBpZiBpdCdzIHNtYWxsIGVub3VnaC4KLWJvb2wgc2VjZGlzY2FyZF9wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKSB7Citib29sIHNlY2Rpc2NhcmRfcGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewogICAgIGF1dG8gZmllbWFwID0gYW5kcm9pZDo6dm9sZDo6UGF0aEZpZW1hcChwYXRoLCBtYXhfZXh0ZW50cyk7CiAgICAgaWYgKCFmaWVtYXAgfHwgIWNoZWNrX2ZpZW1hcCgqZmllbWFwLCBwYXRoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDUsOCArMTMyLDggQEAKICAgICBpZiAoYmxvY2tfZGV2aWNlLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZnNfZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oCi0gICAgICAgIGJsb2NrX2RldmljZS5jX3N0cigpLCBPX1JEV1IgfCBPX0xBUkdFRklMRSB8IE9fQ0xPRVhFQywgMCkpKTsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZnNfZmQoCisgICAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGJsb2NrX2RldmljZS5jX3N0cigpLCBPX1JEV1IgfCBPX0xBUkdFRklMRSB8IE9fQ0xPRVhFQywgMCkpKTsKICAgICBpZiAoZnNfZmQgPT0gLTEpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIGRldmljZSAiIDw8IGJsb2NrX2RldmljZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTI1LDEwICsxNTIsMTAgQEAKIH0KIAogLy8gRW5zdXJlIHRoYXQgdGhlIEZJRU1BUCBjb3ZlcnMgdGhlIGZpbGUgYW5kIGlzIE9LIHRvIGRpc2NhcmQKLWJvb2wgY2hlY2tfZmllbWFwKGNvbnN0IHN0cnVjdCBmaWVtYXAgJmZpZW1hcCwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpIHsKK2Jvb2wgY2hlY2tfZmllbWFwKGNvbnN0IHN0cnVjdCBmaWVtYXAmIGZpZW1hcCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKICAgICBhdXRvIG1hcHBlZCA9IGZpZW1hcC5mbV9tYXBwZWRfZXh0ZW50czsKICAgICBpZiAoIShmaWVtYXAuZm1fZXh0ZW50c1ttYXBwZWQgLSAxXS5mZV9mbGFncyAmIEZJRU1BUF9FWFRFTlRfTEFTVCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXh0ZW50ICIgPDwgbWFwcGVkIC0xIDw8ICIgd2FzIG5vdCB0aGUgbGFzdCBpbiAiIDw8IHBhdGg7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkV4dGVudCAiIDw8IG1hcHBlZCAtIDEgPDwgIiB3YXMgbm90IHRoZSBsYXN0IGluICIgPDwgcGF0aDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWFwcGVkOyBpKyspIHsKQEAgLTE2MCw0ICsxODcsNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi19Cit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NlY29udGV4dC5jcHAgYi9zZWNvbnRleHQuY3BwCmluZGV4IDA1MjlhMzAuLmJjMjFmYzIgMTAwNjQ0Ci0tLSBhL3NlY29udGV4dC5jcHAKKysrIGIvc2Vjb250ZXh0LmNwcApAQCAtMTMsMTAgKzEzLDkgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0jaW5jbHVkZSA8VXRpbHMuaD4KICNpbmNsdWRlICJzZWNvbnRleHQuaCIKKyNpbmNsdWRlIDxVdGlscy5oPgogCi1zZWN1cml0eV9jb250ZXh0X3Qgc2Vjb250ZXh0RnNjaygpCi17CitzZWN1cml0eV9jb250ZXh0X3Qgc2Vjb250ZXh0RnNjaygpIHsKICAgICByZXR1cm4gYW5kcm9pZDo6dm9sZDo6c0ZzY2tDb250ZXh0OwogfQpkaWZmIC0tZ2l0IGEvc2VoYW5kbGUuaCBiL3NlaGFuZGxlLmgKaW5kZXggZjU5ZDdlYi4uODkyMWRiNSAxMDA2NDQKLS0tIGEvc2VoYW5kbGUuaAorKysgYi9zZWhhbmRsZS5oCkBAIC0xOSw2ICsxOSw2IEBACiAKICNpbmNsdWRlIDxzZWxpbnV4L2FuZHJvaWQuaD4KIAotZXh0ZXJuIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqc2VoYW5kbGU7CitleHRlcm4gc3RydWN0IHNlbGFiZWxfaGFuZGxlKiBzZWhhbmRsZTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9DcnlwdGZzU2NyeXB0SGlkbGl6YXRpb25FcXVpdmFsZW5jZV90ZXN0LmNwcCBiL3Rlc3RzL0NyeXB0ZnNTY3J5cHRIaWRsaXphdGlvbkVxdWl2YWxlbmNlX3Rlc3QuY3BwCmluZGV4IDI5MDVhZjIuLjcyMTcwZTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0NyeXB0ZnNTY3J5cHRIaWRsaXphdGlvbkVxdWl2YWxlbmNlX3Rlc3QuY3BwCisrKyBiL3Rlc3RzL0NyeXB0ZnNTY3J5cHRIaWRsaXphdGlvbkVxdWl2YWxlbmNlX3Rlc3QuY3BwCkBAIC0xOCwxMyArMTgsMTMgQEAKICNkZWZpbmUgTE9HX1RBRyAic2NyeXB0X3Rlc3QiCiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9rZXltYXN0ZXIwLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUva2V5bWFzdGVyMS5oPgogI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAotI2luY2x1ZGUgIi4uL2NyeXB0ZnMuaCIKICNpbmNsdWRlICIuLi9LZXltYXN0ZXIuaCIKKyNpbmNsdWRlICIuLi9jcnlwdGZzLmgiCiAKICNpZmRlZiBDT05GSUdfSFdfRElTS19FTkNSWVBUSU9OCiAjaW5jbHVkZSAiY3J5cHRmc19ody5oIgpAQCAtNTAsOSArNTAsOCBAQAogI2RlZmluZSBSU0FfRVhQT05FTlQgMHgxMDAwMQogI2RlZmluZSBLRVlNQVNURVJfQ1JZUFRGU19SQVRFX0xJTUlUIDEgIC8vIE1heGltdW0gb25lIHRyeSBwZXIgc2Vjb25kCiAKLXN0YXRpYyBpbnQga2V5bWFzdGVyX2luaXQoa2V5bWFzdGVyMF9kZXZpY2VfdCAqKmtleW1hc3RlcjBfZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBrZXltYXN0ZXIxX2RldmljZV90ICoqa2V5bWFzdGVyMV9kZXYpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9pbml0KGtleW1hc3RlcjBfZGV2aWNlX3QqKiBrZXltYXN0ZXIwX2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bWFzdGVyMV9kZXZpY2VfdCoqIGtleW1hc3RlcjFfZGV2KSB7CiAgICAgaW50IHJjOwogCiAgICAgY29uc3QgaHdfbW9kdWxlX3QqIG1vZDsKQEAgLTc2LDggKzc1LDggQEAKICAgICB9CiAKICAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBvcGVuIGtleW1hc3RlciBkZXZpY2UgaW4gJXMgKCVzKSIsCi0gICAgICAgICAgICAgIEtFWVNUT1JFX0hBUkRXQVJFX01PRFVMRV9JRCwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3Qgb3BlbiBrZXltYXN0ZXIgZGV2aWNlIGluICVzICglcykiLCBLRVlTVE9SRV9IQVJEV0FSRV9NT0RVTEVfSUQsCisgICAgICAgICAgICAgIHN0cmVycm9yKC1yYykpOwogICAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTkwLDEwICs4OSw5IEBACiB9CiAKIC8qIFNob3VsZCB3ZSB1c2Uga2V5bWFzdGVyPyAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eV9vbGQoKQotewotICAgIGtleW1hc3RlcjBfZGV2aWNlX3QgKmtleW1hc3RlcjBfZGV2ID0gMDsKLSAgICBrZXltYXN0ZXIxX2RldmljZV90ICprZXltYXN0ZXIxX2RldiA9IDA7CitzdGF0aWMgaW50IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5X29sZCgpIHsKKyAgICBrZXltYXN0ZXIwX2RldmljZV90KiBrZXltYXN0ZXIwX2RldiA9IDA7CisgICAga2V5bWFzdGVyMV9kZXZpY2VfdCoga2V5bWFzdGVyMV9kZXYgPSAwOwogICAgIGludCByYyA9IDA7CiAKICAgICBpZiAoa2V5bWFzdGVyX2luaXQoJmtleW1hc3RlcjBfZGV2LCAma2V5bWFzdGVyMV9kZXYpKSB7CkBAIC0xMTQsOCArMTEyLDcgQEAKIAogICAgIC8vIFRPRE8oc3dpbGxkZW4pOiBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbnkgcmVhc29uIHRvIHJlcXVpcmUgdjAuMy4gIEkgdGhpbmsgdjAuMSBhbmQgdjAuMgogICAgIC8vIHNob3VsZCB3b3JrLgotICAgIGlmIChrZXltYXN0ZXIwX2Rldi0+Y29tbW9uLm1vZHVsZS0+bW9kdWxlX2FwaV92ZXJzaW9uCi0gICAgICAgICAgICA8IEtFWU1BU1RFUl9NT0RVTEVfQVBJX1ZFUlNJT05fMF8zKSB7CisgICAgaWYgKGtleW1hc3RlcjBfZGV2LT5jb21tb24ubW9kdWxlLT5tb2R1bGVfYXBpX3ZlcnNpb24gPCBLRVlNQVNURVJfTU9EVUxFX0FQSV9WRVJTSU9OXzBfMykgewogICAgICAgICByYyA9IDA7CiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KQEAgLTEzNiwxMSArMTMzLDEwIEBACiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBrZXltYXN0ZXIga2V5IGFuZCBzdG9yZSBpdCBpbiB0aGlzIGZvb3RlciAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfY3JlYXRlX2tleV9vbGQoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0cikKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2NyZWF0ZV9rZXlfb2xkKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIpIHsKICAgICB1aW50OF90KiBrZXkgPSAwOwotICAgIGtleW1hc3RlcjBfZGV2aWNlX3QgKmtleW1hc3RlcjBfZGV2ID0gMDsKLSAgICBrZXltYXN0ZXIxX2RldmljZV90ICprZXltYXN0ZXIxX2RldiA9IDA7CisgICAga2V5bWFzdGVyMF9kZXZpY2VfdCoga2V5bWFzdGVyMF9kZXYgPSAwOworICAgIGtleW1hc3RlcjFfZGV2aWNlX3QqIGtleW1hc3RlcjFfZGV2ID0gMDsKIAogICAgIGlmIChmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUpIHsKICAgICAgICAgU0xPR0koIkFscmVhZHkgaGF2ZSBrZXkiKTsKQEAgLTE3NywxMSArMTczLDEwIEBACiAgICAgICAgICAgICAvKiBSYXRlLWxpbWl0IGtleSB1c2FnZSBhdHRlbXB0cywgdG8gcmF0ZS1saW1pdCBicnV0ZSBmb3JjZSAqLwogICAgICAgICAgICAga2V5bWFzdGVyX3BhcmFtX2ludChLTV9UQUdfTUlOX1NFQ09ORFNfQkVUV0VFTl9PUFMsIEtFWU1BU1RFUl9DUllQVEZTX1JBVEVfTElNSVQpLAogICAgICAgICB9OwotICAgICAgICBrZXltYXN0ZXJfa2V5X3BhcmFtX3NldF90IHBhcmFtX3NldCA9IHsgcGFyYW1zLCBzaXplb2YocGFyYW1zKS9zaXplb2YoKnBhcmFtcykgfTsKKyAgICAgICAga2V5bWFzdGVyX2tleV9wYXJhbV9zZXRfdCBwYXJhbV9zZXQgPSB7cGFyYW1zLCBzaXplb2YocGFyYW1zKSAvIHNpemVvZigqcGFyYW1zKX07CiAgICAgICAgIGtleW1hc3Rlcl9rZXlfYmxvYl90IGtleV9ibG9iOwotICAgICAgICBrZXltYXN0ZXJfZXJyb3JfdCBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5nZW5lcmF0ZV9rZXkoa2V5bWFzdGVyMV9kZXYsICZwYXJhbV9zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X2Jsb2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGNoYXJhY3RlcmlzdGljcyAqLyk7CisgICAgICAgIGtleW1hc3Rlcl9lcnJvcl90IGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmdlbmVyYXRlX2tleSgKKyAgICAgICAgICAgIGtleW1hc3RlcjFfZGV2LCAmcGFyYW1fc2V0LCAma2V5X2Jsb2IsIE5VTEwgLyogY2hhcmFjdGVyaXN0aWNzICovKTsKICAgICAgICAgaWYgKGVycm9yICE9IEtNX0VSUk9SX09LKSB7CiAgICAgICAgICAgICBTTE9HRSgiRmFpbGVkIHRvIGdlbmVyYXRlIGtleW1hc3RlcjEga2V5LCBlcnJvciAlZCIsIGVycm9yKTsKICAgICAgICAgICAgIHJjID0gLTE7CkBAIC0xOTAsMTUgKzE4NSwxMyBAQAogCiAgICAgICAgIGtleSA9ICh1aW50OF90KilrZXlfYmxvYi5rZXlfbWF0ZXJpYWw7CiAgICAgICAgIGtleV9zaXplID0ga2V5X2Jsb2Iua2V5X21hdGVyaWFsX3NpemU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGtleW1hc3RlcjBfZGV2KSB7CisgICAgfSBlbHNlIGlmIChrZXltYXN0ZXIwX2RldikgewogICAgICAgICBrZXltYXN0ZXJfcnNhX2tleWdlbl9wYXJhbXNfdCBwYXJhbXM7CiAgICAgICAgIG1lbXNldCgmcGFyYW1zLCAnXDAnLCBzaXplb2YocGFyYW1zKSk7CiAgICAgICAgIHBhcmFtcy5wdWJsaWNfZXhwb25lbnQgPSBSU0FfRVhQT05FTlQ7CiAgICAgICAgIHBhcmFtcy5tb2R1bHVzX3NpemUgPSBSU0FfS0VZX1NJWkU7CiAKLSAgICAgICAgaWYgKGtleW1hc3RlcjBfZGV2LT5nZW5lcmF0ZV9rZXlwYWlyKGtleW1hc3RlcjBfZGV2LCBUWVBFX1JTQSwgJnBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksICZrZXlfc2l6ZSkpIHsKKyAgICAgICAgaWYgKGtleW1hc3RlcjBfZGV2LT5nZW5lcmF0ZV9rZXlwYWlyKGtleW1hc3RlcjBfZGV2LCBUWVBFX1JTQSwgJnBhcmFtcywgJmtleSwgJmtleV9zaXplKSkgewogICAgICAgICAgICAgU0xPR0UoIkZhaWxlZCB0byBnZW5lcmF0ZSBrZXlwYWlyIik7CiAgICAgICAgICAgICByYyA9IC0xOwogICAgICAgICAgICAgZ290byBvdXQ7CkBAIC0yMTksMjQgKzIxMiwxOSBAQAogICAgIGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSA9IGtleV9zaXplOwogCiBvdXQ6Ci0gICAgaWYgKGtleW1hc3RlcjBfZGV2KQotICAgICAgICBrZXltYXN0ZXIwX2Nsb3NlKGtleW1hc3RlcjBfZGV2KTsKLSAgICBpZiAoa2V5bWFzdGVyMV9kZXYpCi0gICAgICAgIGtleW1hc3RlcjFfY2xvc2Uoa2V5bWFzdGVyMV9kZXYpOworICAgIGlmIChrZXltYXN0ZXIwX2Rldikga2V5bWFzdGVyMF9jbG9zZShrZXltYXN0ZXIwX2Rldik7CisgICAgaWYgKGtleW1hc3RlcjFfZGV2KSBrZXltYXN0ZXIxX2Nsb3NlKGtleW1hc3RlcjFfZGV2KTsKICAgICBmcmVlKGtleSk7CiAgICAgcmV0dXJuIHJjOwogfQogCiAvKiBUaGlzIHNpZ25zIHRoZSBnaXZlbiBvYmplY3QgdXNpbmcgdGhlIGtleW1hc3RlciBrZXkuICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9zaWduX29iamVjdF9vbGQoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvYmplY3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnNpZ25hdHVyZV9zaXplKQoteworc3RhdGljIGludCBrZXltYXN0ZXJfc2lnbl9vYmplY3Rfb2xkKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgb2JqZWN0X3NpemUsIHVuc2lnbmVkIGNoYXIqKiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBzaWduYXR1cmVfc2l6ZSkgewogICAgIGludCByYyA9IDA7Ci0gICAga2V5bWFzdGVyMF9kZXZpY2VfdCAqa2V5bWFzdGVyMF9kZXYgPSAwOwotICAgIGtleW1hc3RlcjFfZGV2aWNlX3QgKmtleW1hc3RlcjFfZGV2ID0gMDsKKyAgICBrZXltYXN0ZXIwX2RldmljZV90KiBrZXltYXN0ZXIwX2RldiA9IDA7CisgICAga2V5bWFzdGVyMV9kZXZpY2VfdCoga2V5bWFzdGVyMV9kZXYgPSAwOwogCiAgICAgdW5zaWduZWQgY2hhciB0b19zaWduW1JTQV9LRVlfU0laRV9CWVRFU107CiAgICAgc2l6ZV90IHRvX3NpZ25fc2l6ZSA9IHNpemVvZih0b19zaWduKTsKQEAgLTI4NCwzMiArMjcyLDI1IEBACiAgICAgICAgIHBhcmFtcy5kaWdlc3RfdHlwZSA9IERJR0VTVF9OT05FOwogICAgICAgICBwYXJhbXMucGFkZGluZ190eXBlID0gUEFERElOR19OT05FOwogCi0gICAgICAgIHJjID0ga2V5bWFzdGVyMF9kZXYtPnNpZ25fZGF0YShrZXltYXN0ZXIwX2RldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRyLT5rZXltYXN0ZXJfYmxvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zaWduX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX3NpemUpOworICAgICAgICByYyA9IGtleW1hc3RlcjBfZGV2LT5zaWduX2RhdGEoa2V5bWFzdGVyMF9kZXYsICZwYXJhbXMsIGZ0ci0+a2V5bWFzdGVyX2Jsb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUsIHRvX3NpZ24sIHRvX3NpZ25fc2l6ZSwgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX3NpemUpOwogICAgICAgICBnb3RvIG91dDsKICAgICB9IGVsc2UgaWYgKGtleW1hc3RlcjFfZGV2KSB7Ci0gICAgICAgIGtleW1hc3Rlcl9rZXlfYmxvYl90IGtleSA9IHsgZnRyLT5rZXltYXN0ZXJfYmxvYiwgZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplIH07CisgICAgICAgIGtleW1hc3Rlcl9rZXlfYmxvYl90IGtleSA9IHtmdHItPmtleW1hc3Rlcl9ibG9iLCBmdHItPmtleW1hc3Rlcl9ibG9iX3NpemV9OwogICAgICAgICBrZXltYXN0ZXJfa2V5X3BhcmFtX3QgcGFyYW1zW10gPSB7CiAgICAgICAgICAgICBrZXltYXN0ZXJfcGFyYW1fZW51bShLTV9UQUdfUEFERElORywgS01fUEFEX05PTkUpLAogICAgICAgICAgICAga2V5bWFzdGVyX3BhcmFtX2VudW0oS01fVEFHX0RJR0VTVCwgS01fRElHRVNUX05PTkUpLAogICAgICAgICB9OwotICAgICAgICBrZXltYXN0ZXJfa2V5X3BhcmFtX3NldF90IHBhcmFtX3NldCA9IHsgcGFyYW1zLCBzaXplb2YocGFyYW1zKS9zaXplb2YoKnBhcmFtcykgfTsKKyAgICAgICAga2V5bWFzdGVyX2tleV9wYXJhbV9zZXRfdCBwYXJhbV9zZXQgPSB7cGFyYW1zLCBzaXplb2YocGFyYW1zKSAvIHNpemVvZigqcGFyYW1zKX07CiAgICAgICAgIGtleW1hc3Rlcl9vcGVyYXRpb25faGFuZGxlX3Qgb3BfaGFuZGxlOwotICAgICAgICBrZXltYXN0ZXJfZXJyb3JfdCBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5iZWdpbihrZXltYXN0ZXIxX2RldiwgS01fUFVSUE9TRV9TSUdOLCAma2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1fc2V0LCBOVUxMIC8qIG91dF9wYXJhbXMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcF9oYW5kbGUpOworICAgICAgICBrZXltYXN0ZXJfZXJyb3JfdCBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5iZWdpbigKKyAgICAgICAgICAgIGtleW1hc3RlcjFfZGV2LCBLTV9QVVJQT1NFX1NJR04sICZrZXksICZwYXJhbV9zZXQsIE5VTEwgLyogb3V0X3BhcmFtcyAqLywgJm9wX2hhbmRsZSk7CiAgICAgICAgIGlmIChlcnJvciA9PSBLTV9FUlJPUl9LRVlfUkFURV9MSU1JVF9FWENFRURFRCkgewogICAgICAgICAgICAgLy8gS2V5IHVzYWdlIGhhcyBiZWVuIHJhdGUtbGltaXRlZC4gIFdhaXQgYSBiaXQgYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAgICAgIHNsZWVwKEtFWU1BU1RFUl9DUllQVEZTX1JBVEVfTElNSVQpOwotICAgICAgICAgICAgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+YmVnaW4oa2V5bWFzdGVyMV9kZXYsIEtNX1BVUlBPU0VfU0lHTiwgJmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbV9zZXQsIE5VTEwgLyogb3V0X3BhcmFtcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcF9oYW5kbGUpOworICAgICAgICAgICAgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+YmVnaW4oa2V5bWFzdGVyMV9kZXYsIEtNX1BVUlBPU0VfU0lHTiwgJmtleSwgJnBhcmFtX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogb3V0X3BhcmFtcyAqLywgJm9wX2hhbmRsZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGVycm9yICE9IEtNX0VSUk9SX09LKSB7CiAgICAgICAgICAgICBTTE9HRSgiRXJyb3Igc3RhcnRpbmcga2V5bWFzdGVyIHNpZ25hdHVyZSB0cmFuc2FjdGlvbjogJWQiLCBlcnJvcik7CkBAIC0zMTcsMTEgKzI5OCwxMCBAQAogICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgIH0KIAotICAgICAgICBrZXltYXN0ZXJfYmxvYl90IGlucHV0ID0geyB0b19zaWduLCB0b19zaWduX3NpemUgfTsKKyAgICAgICAga2V5bWFzdGVyX2Jsb2JfdCBpbnB1dCA9IHt0b19zaWduLCB0b19zaWduX3NpemV9OwogICAgICAgICBzaXplX3QgaW5wdXRfY29uc3VtZWQ7Ci0gICAgICAgIGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPnVwZGF0ZShrZXltYXN0ZXIxX2Rldiwgb3BfaGFuZGxlLCBOVUxMIC8qIGluX3BhcmFtcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwgJmlucHV0X2NvbnN1bWVkLCBOVUxMIC8qIG91dF9wYXJhbXMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIG91dHB1dCAqLyk7CisgICAgICAgIGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPnVwZGF0ZShrZXltYXN0ZXIxX2Rldiwgb3BfaGFuZGxlLCBOVUxMIC8qIGluX3BhcmFtcyAqLywgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0X2NvbnN1bWVkLCBOVUxMIC8qIG91dF9wYXJhbXMgKi8sIE5VTEwgLyogb3V0cHV0ICovKTsKICAgICAgICAgaWYgKGVycm9yICE9IEtNX0VSUk9SX09LKSB7CiAgICAgICAgICAgICBTTE9HRSgiRXJyb3Igc2VuZGluZyBkYXRhIHRvIGtleW1hc3RlciBzaWduYXR1cmUgdHJhbnNhY3Rpb246ICVkIiwgZXJyb3IpOwogICAgICAgICAgICAgcmMgPSAtMTsKQEAgLTMzNyw4ICszMTcsNyBAQAogCiAgICAgICAgIGtleW1hc3Rlcl9ibG9iX3QgdG1wX3NpZzsKICAgICAgICAgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+ZmluaXNoKGtleW1hc3RlcjFfZGV2LCBvcF9oYW5kbGUsIE5VTEwgLyogaW5fcGFyYW1zICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiB2ZXJpZnkgc2lnbmF0dXJlICovLCBOVUxMIC8qIG91dF9wYXJhbXMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX3NpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIHZlcmlmeSBzaWduYXR1cmUgKi8sIE5VTEwgLyogb3V0X3BhcmFtcyAqLywgJnRtcF9zaWcpOwogICAgICAgICBpZiAoZXJyb3IgIT0gS01fRVJST1JfT0spIHsKICAgICAgICAgICAgIFNMT0dFKCJFcnJvciBmaW5pc2hpbmcga2V5bWFzdGVyIHNpZ25hdHVyZSB0cmFuc2FjdGlvbjogJWQiLCBlcnJvcik7CiAgICAgICAgICAgICByYyA9IC0xOwpAQCAtMzUzLDE5ICszMzIsMTUgQEAKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQogCi0gICAgb3V0OgotICAgICAgICBpZiAoa2V5bWFzdGVyMV9kZXYpCi0gICAgICAgICAgICBrZXltYXN0ZXIxX2Nsb3NlKGtleW1hc3RlcjFfZGV2KTsKLSAgICAgICAgaWYgKGtleW1hc3RlcjBfZGV2KQotICAgICAgICAgICAga2V5bWFzdGVyMF9jbG9zZShrZXltYXN0ZXIwX2Rldik7CitvdXQ6CisgICAgaWYgKGtleW1hc3RlcjFfZGV2KSBrZXltYXN0ZXIxX2Nsb3NlKGtleW1hc3RlcjFfZGV2KTsKKyAgICBpZiAoa2V5bWFzdGVyMF9kZXYpIGtleW1hc3RlcjBfY2xvc2Uoa2V5bWFzdGVyMF9kZXYpOwogCi0gICAgICAgIHJldHVybiByYzsKKyAgICByZXR1cm4gcmM7CiB9CiAKLQogLyogU2hvdWxkIHdlIHVzZSBrZXltYXN0ZXI/ICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5X25ldygpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5X25ldygpIHsKICAgICByZXR1cm4ga2V5bWFzdGVyX2NvbXBhdGliaWxpdHlfY3J5cHRmc19zY3J5cHQoKTsKIH0KIApAQCAtMzk0LDEyICszNjksOSBAQAogI2VuZGlmCiAKIC8qIFRoaXMgc2lnbnMgdGhlIGdpdmVuIG9iamVjdCB1c2luZyB0aGUga2V5bWFzdGVyIGtleS4gKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX3NpZ25fb2JqZWN0X25ldyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9iamVjdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKnNpZ25hdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqc2lnbmF0dXJlX3NpemUpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9zaWduX29iamVjdF9uZXcoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0ciwgY29uc3QgdW5zaWduZWQgY2hhciogb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvYmplY3Rfc2l6ZSwgdW5zaWduZWQgY2hhcioqIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHNpZ25hdHVyZV9zaXplKSB7CiAgICAgdW5zaWduZWQgY2hhciB0b19zaWduW1JTQV9LRVlfU0laRV9CWVRFU107CiAgICAgc2l6ZV90IHRvX3NpZ25fc2l6ZSA9IHNpemVvZih0b19zaWduKTsKICAgICBtZW1zZXQodG9fc2lnbiwgMCwgUlNBX0tFWV9TSVpFX0JZVEVTKTsKQEAgLTQ0MywxMiArNDE1LDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIENyeXB0RnNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICB9CisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQogfTsKIAogVEVTVF9GKENyeXB0RnNUZXN0LCBTY3J5cHRIaWRsaXphdGlvbkVxdWl2YWxlbmNlVGVzdCkgewpAQCAtNDU4LDggKzQyOCw4IEBACiAKICAgICBBU1NFUlRfRVEoMCwga2V5bWFzdGVyX2NyZWF0ZV9rZXlfb2xkKCZmdHIpKTsKIAotICAgIHVpbnQ4X3QgKnNpZzEgPSBudWxscHRyOwotICAgIHVpbnQ4X3QgKnNpZzIgPSBudWxscHRyOworICAgIHVpbnQ4X3QqIHNpZzEgPSBudWxscHRyOworICAgIHVpbnQ4X3QqIHNpZzIgPSBudWxscHRyOwogICAgIHNpemVfdCBzaWdfc2l6ZTEgPSAxMjM0NTY3ODk7CiAgICAgc2l6ZV90IHNpZ19zaXplMiA9IDEyMzQ1Njc4OTsKICAgICB1aW50OF90IG9iamVjdFtdID0gInRoZSBvYmplY3QiOwpAQCAtNDc3LDQgKzQ0Nyw0IEBACiAgICAgZnJlZShzaWcyKTsKIH0KIAotfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL1V0aWxzX3Rlc3QuY3BwIGIvdGVzdHMvVXRpbHNfdGVzdC5jcHAKaW5kZXggYWI5ODA5ZS4uZTE2Y2JhYyAxMDA2NDQKLS0tIGEvdGVzdHMvVXRpbHNfdGVzdC5jcHAKKysrIGIvdGVzdHMvVXRpbHNfdGVzdC5jcHAKQEAgLTIxLDggKzIxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB2b2xkIHsKIAotY2xhc3MgVXRpbHNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotfTsKK2NsYXNzIFV0aWxzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHt9OwogCiBURVNUX0YoVXRpbHNUZXN0LCBGaW5kVmFsdWVUZXN0KSB7CiAgICAgc3RkOjpzdHJpbmcgdG1wOwpAQCAtNDAsNSArMzksNSBAQAogICAgIEFTU0VSVF9FUSgiQkFaIiwgdG1wKTsKIH0KIAotfQotfQorfSAgLy8gbmFtZXNwYWNlIHZvbGQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9jcnlwdGZzX3Rlc3QuY3BwIGIvdGVzdHMvY3J5cHRmc190ZXN0LmNwcAppbmRleCA2ODc1YzBmLi4yMDkzNzY4IDEwMDY0NAotLS0gYS90ZXN0cy9jcnlwdGZzX3Rlc3QuY3BwCisrKyBiL3Rlc3RzL2NyeXB0ZnNfdGVzdC5jcHAKQEAgLTIxLDEyICsyMSwxMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBDcnlwdGZzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgfQorICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkge30KIAotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICB9CisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkge30KIH07CiAKIFRFU1RfRihDcnlwdGZzVGVzdCwgTWF0Y2hNdWx0aUVudHJ5VGVzdCkgewpAQCAtNTEsNCArNDksNCBAQAogICAgIEFTU0VSVF9FUSgwLCBtYXRjaF9tdWx0aV9lbnRyeSgiZm9vXzIiLCAiYmFyIiwgMCkpOwogfQogCi19Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdmRjLmNwcCBiL3ZkYy5jcHAKaW5kZXggM2M0NDlhZS4uZTk3MWQ1MiAxMDA2NDQKLS0tIGEvdmRjLmNwcAorKysgYi92ZGMuY3BwCkBAIC0xNCwxNSArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtMzIsMTMgKzMxLDE0IEBACiAjaW5jbHVkZSAiYW5kcm9pZC9vcy9JVm9sZC5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCi1zdGF0aWMgdm9pZCB1c2FnZShjaGFyICpwcm9nbmFtZSk7CitzdGF0aWMgdm9pZCB1c2FnZShjaGFyKiBwcm9nbmFtZSk7CiAKIHN0YXRpYyBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJQmluZGVyPiBnZXRTZXJ2aWNlQWdncmVzc2l2ZSgpIHsKICAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJQmluZGVyPiByZXM7CkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIldhaXRlZCAiIDw8IChpICogMTApIDw8ICJtcyBmb3Igdm9sZCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICB1c2xlZXAoMTAwMDApOyAvLyAxMG1zCisgICAgICAgIHVzbGVlcCgxMDAwMCk7ICAvLyAxMG1zCiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CkBAIC0xMDUsNiArMTA1LDI4IEBACiAgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPm1vdW50RnN0YWIoYXJnc1syXSkpOwogICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PSAiY3J5cHRmcyIgJiYgYXJnc1sxXSA9PSAiZW5jcnlwdEZzdGFiIiAmJiBhcmdzLnNpemUoKSA9PSAzKSB7CiAgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPmVuY3J5cHRGc3RhYihhcmdzWzJdKSk7CisgICAgfSBlbHNlIGlmIChhcmdzWzBdID09ICJjaGVja3BvaW50IiAmJiBhcmdzWzFdID09ICJzdGFydENoZWNrcG9pbnQiICYmIGFyZ3Muc2l6ZSgpID09IDMpIHsKKyAgICAgICAgaW50IHJldHJ5OworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlSW50KGFyZ3NbMl0sICZyZXRyeSkpIGV4aXQoRUlOVkFMKTsKKyAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+c3RhcnRDaGVja3BvaW50KHJldHJ5KSk7CisgICAgfSBlbHNlIGlmIChhcmdzWzBdID09ICJjaGVja3BvaW50IiAmJiBhcmdzWzFdID09ICJuZWVkc0NoZWNrcG9pbnQiICYmIGFyZ3Muc2l6ZSgpID09IDIpIHsKKyAgICAgICAgYm9vbCBlbmFibGVkID0gZmFsc2U7CisgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPm5lZWRzQ2hlY2twb2ludCgmZW5hYmxlZCkpOworICAgICAgICByZXR1cm4gZW5hYmxlZCA/IDEgOiAwOworICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PSAiY2hlY2twb2ludCIgJiYgYXJnc1sxXSA9PSAibmVlZHNSb2xsYmFjayIgJiYgYXJncy5zaXplKCkgPT0gMikgeworICAgICAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+bmVlZHNSb2xsYmFjaygmZW5hYmxlZCkpOworICAgICAgICByZXR1cm4gZW5hYmxlZCA/IDEgOiAwOworICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PSAiY2hlY2twb2ludCIgJiYgYXJnc1sxXSA9PSAiY29tbWl0Q2hhbmdlcyIgJiYgYXJncy5zaXplKCkgPT0gMikgeworICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5jb21taXRDaGFuZ2VzKCkpOworICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PSAiY2hlY2twb2ludCIgJiYgYXJnc1sxXSA9PSAicHJlcGFyZUNoZWNrcG9pbnQiICYmIGFyZ3Muc2l6ZSgpID09IDIpIHsKKyAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+cHJlcGFyZUNoZWNrcG9pbnQoKSk7CisgICAgfSBlbHNlIGlmIChhcmdzWzBdID09ICJjaGVja3BvaW50IiAmJiBhcmdzWzFdID09ICJyZXN0b3JlQ2hlY2twb2ludCIgJiYgYXJncy5zaXplKCkgPT0gMykgeworICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5yZXN0b3JlQ2hlY2twb2ludChhcmdzWzJdKSk7CisgICAgfSBlbHNlIGlmIChhcmdzWzBdID09ICJjaGVja3BvaW50IiAmJiBhcmdzWzFdID09ICJtYXJrQm9vdEF0dGVtcHQiICYmIGFyZ3Muc2l6ZSgpID09IDIpIHsKKyAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+bWFya0Jvb3RBdHRlbXB0KCkpOworICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PSAiY2hlY2twb2ludCIgJiYgYXJnc1sxXSA9PSAiYWJvcnRDaGFuZ2VzIiAmJiBhcmdzLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPmFib3J0Q2hhbmdlcygpKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0coRVJST1IpIDw8ICJSYXcgY29tbWFuZHMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQiOwogICAgICAgICBleGl0KEVJTlZBTCk7CkBAIC0xMTIsNiArMTM0LDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqcHJvZ25hbWUpIHsKK3N0YXRpYyB2b2lkIHVzYWdlKGNoYXIqIHByb2duYW1lKSB7CiAgICAgTE9HKElORk8pIDw8ICJVc2FnZTogIiA8PCBwcm9nbmFtZSA8PCAiIFstLXdhaXRdIDxzeXN0ZW0+IDxzdWJjb21tYW5kPiBbYXJncy4uLl0iOwogfQpkaWZmIC0tZ2l0IGEvdm9sZC5yYyBiL3ZvbGQucmMKaW5kZXggN2QxNDQ1My4uOTNkODc4NiAxMDA2NDQKLS0tIGEvdm9sZC5yYworKysgYi92b2xkLnJjCkBAIC01LDQgKzUsNCBAQAogICAgIGlvcHJpbyBiZSAyCiAgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwogICAgIHNodXRkb3duIGNyaXRpY2FsCi0gICAgZ3JvdXAgcmVzZXJ2ZWRfZGlzaworICAgIGdyb3VwIHJvb3QgcmVzZXJ2ZWRfZGlzawpkaWZmIC0tZ2l0IGEvdm9sZF9wcmVwYXJlX3N1YmRpcnMuY3BwIGIvdm9sZF9wcmVwYXJlX3N1YmRpcnMuY3BwCmluZGV4IDFiNDY2ZTkuLjhjM2RmMzAgMTAwNjQ0Ci0tLSBhL3ZvbGRfcHJlcGFyZV9zdWJkaXJzLmNwcAorKysgYi92b2xkX3ByZXBhcmVfc3ViZGlycy5jcHAKQEAgLTYzLDcgKzYzLDggQEAKICAgICAgICAgc2Vjb250ZXh0LnJlc2V0KHRtcF9zZWNvbnRleHQpOwogICAgIH0KICAgICBMT0coREVCVUcpIDw8ICJTZXR0aW5nIHVwIG1vZGUgIiA8PCBzdGQ6Om9jdCA8PCBtb2RlIDw8IHN0ZDo6ZGVjIDw8ICIgdWlkICIgPDwgdWlkIDw8ICIgZ2lkICIKLSAgICAgICAgICAgICAgIDw8IGdpZCA8PCAiIGNvbnRleHQgIiA8PCBzZWNvbnRleHQuZ2V0KCkgPDwgIiBvbiBwYXRoOiAiIDw8IHBhdGg7CisgICAgICAgICAgICAgICA8PCBnaWQgPDwgIiBjb250ZXh0ICIgPDwgKHNlY29udGV4dCA/IHNlY29udGV4dC5nZXQoKSA6ICJudWxsIikKKyAgICAgICAgICAgICAgIDw8ICIgb24gcGF0aDogIiA8PCBwYXRoOwogICAgIGlmIChzZWNvbnRleHQpIHsKICAgICAgICAgaWYgKHNldGZzY3JlYXRlY29uKHNlY29udGV4dC5nZXQoKSkgIT0gMCkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byByZWFkIHNldGZzY3JlYXRlY29uIGZvcjogIiA8PCBwYXRoOwo=