ZGlmZiAtLWdpdCBhL0JlbmNobWFyay5jcHAgYi9CZW5jaG1hcmsuY3BwCmluZGV4IGRmZTMzNjYuLjdmYmY5MmUgMTAwNjQ0Ci0tLSBhL0JlbmNobWFyay5jcHAKKysrIGIvQmVuY2htYXJrLmNwcApAQCAtMjgsOCArMjgsOCBAQAogCiAjaW5jbHVkZSA8dGhyZWFkPgogCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nOwpAQCAtNTAsMTIgKzUwLDEyIEBACiAKIC8vIFJBSUkgY2xhc3MgZm9yIGJvb3N0aW5nIGRldmljZSBwZXJmb3JtYW5jZSBkdXJpbmcgYmVuY2htYXJrcy4KIGNsYXNzIFBlcmZvcm1hbmNlQm9vc3QgewotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICBpbnQgb3JpZ19wcmlvOwogICAgIGludCBvcmlnX2lvcHJpbzsKICAgICBJb1NjaGVkQ2xhc3Mgb3JpZ19jbGF6ejsKIAotcHVibGljOgorICBwdWJsaWM6CiAgICAgUGVyZm9ybWFuY2VCb29zdCgpIHsKICAgICAgICAgZXJybm8gPSAwOwogICAgICAgICBvcmlnX3ByaW8gPSBnZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDApOwpAQCAtODcsOCArODcsOCBAQAogfTsKIAogc3RhdGljIHN0YXR1c190IGJlbmNobWFya0ludGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiByb290UGF0aCwKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIsCi0gICAgICAgIGFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZSogZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlKiBleHRyYXMpIHsKICAgICBzdGF0dXNfdCByZXMgPSAwOwogCiAgICAgYXV0byBwYXRoID0gcm9vdFBhdGg7CkBAIC0xNzksNyArMTc5LDcgQEAKIH0KIAogdm9pZCBCZW5jaG1hcmsoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGtCZW5jaG1hcmtMb2NrKTsKICAgICBhY3F1aXJlX3dha2VfbG9jayhQQVJUSUFMX1dBS0VfTE9DSywga1dha2VMb2NrKTsKIApkaWZmIC0tZ2l0IGEvQmVuY2htYXJrLmggYi9CZW5jaG1hcmsuaAppbmRleCA0ZjE5YjAxLi5kNTg4MmNkIDEwMDY0NAotLS0gYS9CZW5jaG1hcmsuaAorKysgYi9CZW5jaG1hcmsuaApAQCAtMjQsOCArMjQsMTAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB2b2xkIHsKIAorLy8gY2xhbmctZm9ybWF0IG9mZgogdm9pZCBCZW5jaG1hcmsoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKy8vIGNsYW5nLWZvcm1hdCBvbgogCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL0Rldm1hcHBlci5jcHAgYi9EZXZtYXBwZXIuY3BwCmluZGV4IDI1MTA3NzEuLmU1YzdlMzcgMTAwNjQ0Ci0tLSBhL0Rldm1hcHBlci5jcHAKKysrIGIvRGV2bWFwcGVyLmNwcApAQCAtMTYsMjMgKzE2LDIyIEBACiAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1BBQ0tBR0VfTUFOQUdFUgogCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlICJEZXZtYXBwZXIuaCIKQEAgLTQzLDggKzQyLDcgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIqIGtWb2xkUHJlZml4ID0gInZvbGQ6IjsKIAotdm9pZCBEZXZtYXBwZXI6OmlvY3RsSW5pdChzdHJ1Y3QgZG1faW9jdGwgKmlvLCBzaXplX3QgZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGZsYWdzKSB7Cit2b2lkIERldm1hcHBlcjo6aW9jdGxJbml0KHN0cnVjdCBkbV9pb2N0bCogaW8sIHNpemVfdCBkYXRhU2l6ZSwgY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgZmxhZ3MpIHsKICAgICBtZW1zZXQoaW8sIDAsIGRhdGFTaXplKTsKICAgICBpby0+ZGF0YV9zaXplID0gZGF0YVNpemU7CiAgICAgaW8tPmRhdGFfc3RhcnQgPSBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKQEAgLTU0LDE3ICs1MiwxNiBAQAogICAgIGlvLT5mbGFncyA9IGZsYWdzOwogICAgIGlmIChuYW1lKSB7CiAgICAgICAgIHNpemVfdCByZXQgPSBzdHJsY3B5KGlvLT5uYW1lLCBuYW1lLCBzaXplb2YoaW8tPm5hbWUpKTsKLSAgICAgICAgaWYgKHJldCA+PSBzaXplb2YoaW8tPm5hbWUpKQotICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgaWYgKHJldCA+PSBzaXplb2YoaW8tPm5hbWUpKSBhYm9ydCgpOwogICAgIH0KIH0KIAotaW50IERldm1hcHBlcjo6Y3JlYXRlKGNvbnN0IGNoYXIgKm5hbWVfcmF3LCBjb25zdCBjaGFyICpsb29wRmlsZSwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY2hhciAqdWJ1ZmZlciwgc2l6ZV90IGxlbikgeworaW50IERldm1hcHBlcjo6Y3JlYXRlKGNvbnN0IGNoYXIqIG5hbWVfcmF3LCBjb25zdCBjaGFyKiBsb29wRmlsZSwgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY2hhciogdWJ1ZmZlciwgc2l6ZV90IGxlbikgewogICAgIGF1dG8gbmFtZV9zdHJpbmcgPSBTdHJpbmdQcmludGYoIiVzJXMiLCBrVm9sZFByZWZpeCwgbmFtZV9yYXcpOwogICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBuYW1lX3N0cmluZy5jX3N0cigpOwogCi0gICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKikgbWFsbG9jKERFVk1BUFBFUl9CVUZGRVJfU0laRSk7CisgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKW1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOwogICAgIGlmICghYnVmZmVyKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgbWFsbG9jIjsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNzcsOCArNzQsOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgc3RydWN0IGRtX2lvY3RsICppbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOwotIAorICAgIHN0cnVjdCBkbV9pb2N0bCogaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CisKICAgICAvLyBDcmVhdGUgdGhlIERNIGRldmljZQogICAgIGlvY3RsSW5pdChpbywgREVWTUFQUEVSX0JVRkZFUl9TSVpFLCBuYW1lLCAwKTsKIApAQCAtOTIsMTEgKzg5LDExIEBACiAgICAgLy8gU2V0IHRoZSBsZWdhY3kgZ2VvbWV0cnkKICAgICBpb2N0bEluaXQoaW8sIERFVk1BUFBFUl9CVUZGRVJfU0laRSwgbmFtZSwgMCk7CiAKLSAgICBjaGFyICpnZW9QYXJhbXMgPSBidWZmZXIgKyBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKKyAgICBjaGFyKiBnZW9QYXJhbXMgPSBidWZmZXIgKyBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKICAgICAvLyBicHM9NTEyIHNwYz04IHJlcz0zMiBuZnQ9MiBzZWM9ODE5MCBtaWQ9MHhmMCBzcHQ9NjMgaGRzPTY0IGhpZD0wIGJzcGY9OCByZGNsPTIgaW5mcz0xIGJrYnM9MgogICAgIHN0cmxjcHkoZ2VvUGFyYW1zLCAiMCA2NCA2MyAwIiwgREVWTUFQUEVSX0JVRkZFUl9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkpOwogICAgIGdlb1BhcmFtcyArPSBzdHJsZW4oZ2VvUGFyYW1zKSArIDE7Ci0gICAgZ2VvUGFyYW1zID0gKGNoYXIgKikgX2FsaWduKGdlb1BhcmFtcywgOCk7CisgICAgZ2VvUGFyYW1zID0gKGNoYXIqKV9hbGlnbihnZW9QYXJhbXMsIDgpOwogICAgIGlmIChpb2N0bChmZCwgRE1fREVWX1NFVF9HRU9NRVRSWSwgaW8pKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgRE1fREVWX1NFVF9HRU9NRVRSWSI7CiAgICAgICAgIGZyZWUoYnVmZmVyKTsKQEAgLTExNyw4ICsxMTQsOCBAQAogICAgIHNucHJpbnRmKHVidWZmZXIsIGxlbiwgIi9kZXYvYmxvY2svZG0tJXUiLCBtaW5vcik7CiAKICAgICAvLyBMb2FkIHRoZSB0YWJsZQotICAgIHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqdGd0OwotICAgIHRndCA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgKikgJmJ1ZmZlcltzaXplb2Yoc3RydWN0IGRtX2lvY3RsKV07CisgICAgc3RydWN0IGRtX3RhcmdldF9zcGVjKiB0Z3Q7CisgICAgdGd0ID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyopJmJ1ZmZlcltzaXplb2Yoc3RydWN0IGRtX2lvY3RsKV07CiAKICAgICBpb2N0bEluaXQoaW8sIERFVk1BUFBFUl9CVUZGRVJfU0laRSwgbmFtZSwgRE1fU1RBVFVTX1RBQkxFX0ZMQUcpOwogICAgIGlvLT50YXJnZXRfY291bnQgPSAxOwpAQCAtMTI5LDEyICsxMjYsMTIgQEAKIAogICAgIHN0cmxjcHkodGd0LT50YXJnZXRfdHlwZSwgImNyeXB0Iiwgc2l6ZW9mKHRndC0+dGFyZ2V0X3R5cGUpKTsKIAotICAgIGNoYXIgKmNyeXB0UGFyYW1zID0gYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKTsKKyAgICBjaGFyKiBjcnlwdFBhcmFtcyA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYyk7CiAgICAgc25wcmludGYoY3J5cHRQYXJhbXMsCi0gICAgICAgICAgICBERVZNQVBQRVJfQlVGRkVSX1NJWkUgLSAoc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKSksCi0gICAgICAgICAgICAidHdvZmlzaCAlcyAwICVzIDAiLCBrZXksIGxvb3BGaWxlKTsKKyAgICAgICAgICAgICBERVZNQVBQRVJfQlVGRkVSX1NJWkUgLSAoc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKSksCisgICAgICAgICAgICAgInR3b2Zpc2ggJXMgMCAlcyAwIiwga2V5LCBsb29wRmlsZSk7CiAgICAgY3J5cHRQYXJhbXMgKz0gc3RybGVuKGNyeXB0UGFyYW1zKSArIDE7Ci0gICAgY3J5cHRQYXJhbXMgPSAoY2hhciAqKSBfYWxpZ24oY3J5cHRQYXJhbXMsIDgpOworICAgIGNyeXB0UGFyYW1zID0gKGNoYXIqKV9hbGlnbihjcnlwdFBhcmFtcywgOCk7CiAgICAgdGd0LT5uZXh0ID0gY3J5cHRQYXJhbXMgLSBidWZmZXI7CiAKICAgICBpZiAoaW9jdGwoZmQsIERNX1RBQkxFX0xPQUQsIGlvKSkgewpAQCAtMTYwLDExICsxNTcsMTEgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IERldm1hcHBlcjo6ZGVzdHJveShjb25zdCBjaGFyICpuYW1lX3JhdykgeworaW50IERldm1hcHBlcjo6ZGVzdHJveShjb25zdCBjaGFyKiBuYW1lX3JhdykgewogICAgIGF1dG8gbmFtZV9zdHJpbmcgPSBTdHJpbmdQcmludGYoIiVzJXMiLCBrVm9sZFByZWZpeCwgbmFtZV9yYXcpOwogICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBuYW1lX3N0cmluZy5jX3N0cigpOwogCi0gICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKikgbWFsbG9jKERFVk1BUFBFUl9CVUZGRVJfU0laRSk7CisgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKW1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOwogICAgIGlmICghYnVmZmVyKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgbWFsbG9jIjsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTc3LDggKzE3NCw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBzdHJ1Y3QgZG1faW9jdGwgKmlvID0gKHN0cnVjdCBkbV9pb2N0bCAqKSBidWZmZXI7Ci0gCisgICAgc3RydWN0IGRtX2lvY3RsKiBpbyA9IChzdHJ1Y3QgZG1faW9jdGwqKWJ1ZmZlcjsKKwogICAgIC8vIENyZWF0ZSB0aGUgRE0gZGV2aWNlCiAgICAgaW9jdGxJbml0KGlvLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUsIG5hbWUsIDApOwogCkBAIC0xOTgsMTQgKzE5NSwxNCBAQAogCiBpbnQgRGV2bWFwcGVyOjpkZXN0cm95QWxsKCkgewogICAgIEFUUkFDRV9OQU1FKCJEZXZtYXBwZXI6OmRlc3Ryb3lBbGwiKTsKLSAgICBjaGFyICpidWZmZXIgPSAoY2hhciAqKSBtYWxsb2MoMTAyNCAqIDY0KTsKKyAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopbWFsbG9jKDEwMjQgKiA2NCk7CiAgICAgaWYgKCFidWZmZXIpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCBtYWxsb2MiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIG1lbXNldChidWZmZXIsIDAsICgxMDI0ICogNjQpKTsKIAotICAgIGNoYXIgKmJ1ZmZlcjIgPSAoY2hhciAqKSBtYWxsb2MoREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKKyAgICBjaGFyKiBidWZmZXIyID0gKGNoYXIqKW1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOwogICAgIGlmICghYnVmZmVyMikgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIG1hbGxvYyI7CiAgICAgICAgIGZyZWUoYnVmZmVyKTsKQEAgLTIyMCw3ICsyMTcsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgc3RydWN0IGRtX2lvY3RsICppbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOworICAgIHN0cnVjdCBkbV9pb2N0bCogaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CiAgICAgaW9jdGxJbml0KGlvLCAoMTAyNCAqIDY0KSwgTlVMTCwgMCk7CiAKICAgICBpZiAoaW9jdGwoZmQsIERNX0xJU1RfREVWSUNFUywgaW8pKSB7CkBAIC0yMzEsNyArMjI4LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHN0cnVjdCBkbV9uYW1lX2xpc3QgKm4gPSAoc3RydWN0IGRtX25hbWVfbGlzdCAqKSAoKChjaGFyICopIGJ1ZmZlcikgKyBpby0+ZGF0YV9zdGFydCk7CisgICAgc3RydWN0IGRtX25hbWVfbGlzdCogbiA9IChzdHJ1Y3QgZG1fbmFtZV9saXN0KikoKChjaGFyKilidWZmZXIpICsgaW8tPmRhdGFfc3RhcnQpOwogICAgIGlmICghbi0+ZGV2KSB7CiAgICAgICAgIGZyZWUoYnVmZmVyKTsKICAgICAgICAgZnJlZShidWZmZXIyKTsKQEAgLTI0MSwxMyArMjM4LDEzIEBACiAKICAgICB1bnNpZ25lZCBueHQgPSAwOwogICAgIGRvIHsKLSAgICAgICAgbiA9IChzdHJ1Y3QgZG1fbmFtZV9saXN0ICopICgoKGNoYXIgKikgbikgKyBueHQpOworICAgICAgICBuID0gKHN0cnVjdCBkbV9uYW1lX2xpc3QqKSgoKGNoYXIqKW4pICsgbnh0KTsKICAgICAgICAgYXV0byBuYW1lID0gc3RkOjpzdHJpbmcobi0+bmFtZSk7CiAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKG5hbWUsIGtWb2xkUHJlZml4KSkgewogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiVGVhcmluZyBkb3duIHN0YWxlIGRtIGRldmljZSBuYW1lZCAiIDw8IG5hbWU7CiAKICAgICAgICAgICAgIG1lbXNldChidWZmZXIyLCAwLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUpOwotICAgICAgICAgICAgc3RydWN0IGRtX2lvY3RsICppbzIgPSAoc3RydWN0IGRtX2lvY3RsICopIGJ1ZmZlcjI7CisgICAgICAgICAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvMiA9IChzdHJ1Y3QgZG1faW9jdGwqKWJ1ZmZlcjI7CiAgICAgICAgICAgICBpb2N0bEluaXQoaW8yLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUsIG4tPm5hbWUsIDApOwogICAgICAgICAgICAgaWYgKGlvY3RsKGZkLCBETV9ERVZfUkVNT1ZFLCBpbzIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVOWElPKSB7CkBAIC0yNjYsOSArMjYzLDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCAqRGV2bWFwcGVyOjpfYWxpZ24odm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgYSkKLXsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBhZ24gPSAtLWE7Cit2b2lkKiBEZXZtYXBwZXI6Ol9hbGlnbih2b2lkKiBwdHIsIHVuc2lnbmVkIGludCBhKSB7CisgICAgdW5zaWduZWQgbG9uZyBhZ24gPSAtLWE7CiAKLSAgICAgICAgcmV0dXJuICh2b2lkICopICgoKHVuc2lnbmVkIGxvbmcpIHB0ciArIGFnbikgJiB+YWduKTsKKyAgICByZXR1cm4gKHZvaWQqKSgoKHVuc2lnbmVkIGxvbmcpcHRyICsgYWduKSAmIH5hZ24pOwogfQpkaWZmIC0tZ2l0IGEvRGV2bWFwcGVyLmggYi9EZXZtYXBwZXIuaAppbmRleCA3YmI5Nzg2Li5iMWY2ZGZhIDEwMDY0NAotLS0gYS9EZXZtYXBwZXIuaAorKysgYi9EZXZtYXBwZXIuaApAQCAtMTcsMjAgKzE3LDE5IEBACiAjaWZuZGVmIF9ERVZNQVBQRVJfSAogI2RlZmluZSBfREVWTUFQUEVSX0gKIAotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtLWlvY3RsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKIGNsYXNzIERldm1hcHBlciB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGludCBjcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbG9vcEZpbGUsIGNvbnN0IGNoYXIgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbik7Ci0gICAgc3RhdGljIGludCBkZXN0cm95KGNvbnN0IGNoYXIgKm5hbWUpOworICBwdWJsaWM6CisgICAgc3RhdGljIGludCBjcmVhdGUoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogbG9vcEZpbGUsIGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbik7CisgICAgc3RhdGljIGludCBkZXN0cm95KGNvbnN0IGNoYXIqIG5hbWUpOwogICAgIHN0YXRpYyBpbnQgZGVzdHJveUFsbCgpOwogCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkICpfYWxpZ24odm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgYSk7Ci0gICAgc3RhdGljIHZvaWQgaW9jdGxJbml0KHN0cnVjdCBkbV9pb2N0bCAqaW8sIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGZsYWdzKTsKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgdm9pZCogX2FsaWduKHZvaWQqIHB0ciwgdW5zaWduZWQgaW50IGEpOworICAgIHN0YXRpYyB2b2lkIGlvY3RsSW5pdChzdHJ1Y3QgZG1faW9jdGwqIGlvLCBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBjaGFyKiBuYW1lLCB1bnNpZ25lZCBmbGFncyk7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL0VuY3J5cHRJbnBsYWNlLmNwcCBiL0VuY3J5cHRJbnBsYWNlLmNwcAppbmRleCA2NDYyZGJmLi43ZjBkNzcwIDEwMDY0NAotLS0gYS9FbmNyeXB0SW5wbGFjZS5jcHAKKysrIGIvRW5jcnlwdElucGxhY2UuY3BwCkBAIC0xNiwxNiArMTYsMTYgQEAKIAogI2luY2x1ZGUgIkVuY3J5cHRJbnBsYWNlLmgiCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxleHQ0X3V0aWxzL2V4dDQuaD4KICNpbmNsdWRlIDxleHQ0X3V0aWxzL2V4dDRfdXRpbHMuaD4KICNpbmNsdWRlIDxmMmZzX3NwYXJzZWJsb2NrLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKQEAgLTM2LDEzICszNiwxMSBAQAogI2luY2x1ZGUgImNyeXB0ZnMuaCIKIAogLy8gRklYTUUgaG9ycmlibGUgY3V0LWFuZC1wYXN0ZSBjb2RlCi1zdGF0aWMgaW5saW5lIGludCB1bml4X3JlYWQoaW50ICBmZCwgdm9pZCogIGJ1ZmYsIGludCAgbGVuKQoteworc3RhdGljIGlubGluZSBpbnQgdW5peF9yZWFkKGludCBmZCwgdm9pZCogYnVmZiwgaW50IGxlbikgewogICAgIHJldHVybiBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChmZCwgYnVmZiwgbGVuKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVuaXhfd3JpdGUoaW50ICBmZCwgY29uc3Qgdm9pZCogIGJ1ZmYsIGludCAgbGVuKQoteworc3RhdGljIGlubGluZSBpbnQgdW5peF93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQqIGJ1ZmYsIGludCBsZW4pIHsKICAgICByZXR1cm4gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLCBidWZmLCBsZW4pKTsKIH0KIApAQCAtNTcsMTUgKzU1LDE0IEBACiAjZGVmaW5lIEJMT0NLU19BVF9BX1RJTUUgMTAyNAogI2VuZGlmCiAKLXN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YQoteworc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhIHsKICAgICBpbnQgcmVhbGZkOwogICAgIGludCBjcnlwdG9mZDsKICAgICBvZmY2NF90IG51bWJsb2NrczsKICAgICBvZmY2NF90IG9uZV9wY3QsIGN1cl9wY3QsIG5ld19wY3Q7CiAgICAgb2ZmNjRfdCBibG9ja3NfYWxyZWFkeV9kb25lLCB0b3RfbnVtYmxvY2tzOwogICAgIG9mZjY0X3QgdXNlZF9ibG9ja3NfYWxyZWFkeV9kb25lLCB0b3RfdXNlZF9ibG9ja3M7Ci0gICAgY2hhciogcmVhbF9ibGtkZXYsICogY3J5cHRvX2Jsa2RldjsKKyAgICBjaGFyICpyZWFsX2Jsa2RldiwgKmNyeXB0b19ibGtkZXY7CiAgICAgaW50IGNvdW50OwogICAgIG9mZjY0X3Qgb2Zmc2V0OwogICAgIGNoYXIqIGJ1ZmZlcjsKQEAgLTc2LDggKzczLDcgQEAKICAgICBib29sIHNldF9wcm9ncmVzc19wcm9wZXJ0aWVzOwogfTsKIAotc3RhdGljIHZvaWQgdXBkYXRlX3Byb2dyZXNzKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogZGF0YSwgaW50IGlzX3VzZWQpCi17CitzdGF0aWMgdm9pZCB1cGRhdGVfcHJvZ3Jlc3Moc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKiBkYXRhLCBpbnQgaXNfdXNlZCkgewogICAgIGRhdGEtPmJsb2Nrc19hbHJlYWR5X2RvbmUrKzsKIAogICAgIGlmIChpc191c2VkKSB7CkBAIC0xMDQsMTYgKzEwMCwxNCBAQAogICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJFcnJvciBnZXR0aW5nIHRpbWUiOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZG91YmxlIGVsYXBzZWRfdGltZSA9IGRpZmZ0aW1lKHRpbWVfbm93LnR2X3NlYywgZGF0YS0+dGltZV9zdGFydGVkKTsKLSAgICAgICAgICAgIG9mZjY0X3QgcmVtYWluaW5nX2Jsb2NrcyA9IGRhdGEtPnRvdF91c2VkX2Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBkYXRhLT51c2VkX2Jsb2Nrc19hbHJlYWR5X2RvbmU7Ci0gICAgICAgICAgICBpbnQgcmVtYWluaW5nX3RpbWUgPSAoaW50KShlbGFwc2VkX3RpbWUgKiByZW1haW5pbmdfYmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIGRhdGEtPnVzZWRfYmxvY2tzX2FscmVhZHlfZG9uZSk7CisgICAgICAgICAgICBvZmY2NF90IHJlbWFpbmluZ19ibG9ja3MgPSBkYXRhLT50b3RfdXNlZF9ibG9ja3MgLSBkYXRhLT51c2VkX2Jsb2Nrc19hbHJlYWR5X2RvbmU7CisgICAgICAgICAgICBpbnQgcmVtYWluaW5nX3RpbWUgPQorICAgICAgICAgICAgICAgIChpbnQpKGVsYXBzZWRfdGltZSAqIHJlbWFpbmluZ19ibG9ja3MgLyBkYXRhLT51c2VkX2Jsb2Nrc19hbHJlYWR5X2RvbmUpOwogCiAgICAgICAgICAgICAvLyBDaGFuZ2UgdGltZSBvbmx5IGlmIG5vdCB5ZXQgc2V0LCBsb3dlciwgb3IgYSBsb3QgaGlnaGVyIGZvcgogICAgICAgICAgICAgLy8gYmVzdCB1c2VyIGV4cGVyaWVuY2UKLSAgICAgICAgICAgIGlmIChkYXRhLT5yZW1haW5pbmdfdGltZSA9PSAtMQotICAgICAgICAgICAgICAgIHx8IHJlbWFpbmluZ190aW1lIDwgZGF0YS0+cmVtYWluaW5nX3RpbWUKLSAgICAgICAgICAgICAgICB8fCByZW1haW5pbmdfdGltZSA+IGRhdGEtPnJlbWFpbmluZ190aW1lICsgNjApIHsKKyAgICAgICAgICAgIGlmIChkYXRhLT5yZW1haW5pbmdfdGltZSA9PSAtMSB8fCByZW1haW5pbmdfdGltZSA8IGRhdGEtPnJlbWFpbmluZ190aW1lIHx8CisgICAgICAgICAgICAgICAgcmVtYWluaW5nX3RpbWUgPiBkYXRhLT5yZW1haW5pbmdfdGltZSArIDYwKSB7CiAgICAgICAgICAgICAgICAgY2hhciBidWZbOF07CiAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgcmVtYWluaW5nX3RpbWUpOwogICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJ2b2xkLmVuY3J5cHRfdGltZV9yZW1haW5pbmciLCBidWYpOwpAQCAtMTIzLDggKzExNyw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBsb2dfcHJvZ3Jlc3Moc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhIGNvbnN0KiBkYXRhLCBib29sIGNvbXBsZXRlZCkKLXsKK3N0YXRpYyB2b2lkIGxvZ19wcm9ncmVzcyhzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgY29uc3QqIGRhdGEsIGJvb2wgY29tcGxldGVkKSB7CiAgICAgLy8gUHJlY29uZGl0aW9uIC0gaWYgY29tcGxldGVkIGRhdGEgPSAwIGVsc2UgZGF0YSAhPSAwCiAKICAgICAvLyBUcmFjayBwcm9ncmVzcyBzbyB3ZSBjYW4gc2tpcCBsb2dnaW5nIGJsb2NrcwpAQCAtMTQ3LDggKzE0MCw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IGZsdXNoX291dHN0YW5kaW5nX2RhdGEoc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKiBkYXRhKQoteworc3RhdGljIGludCBmbHVzaF9vdXRzdGFuZGluZ19kYXRhKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogZGF0YSkgewogICAgIGlmIChkYXRhLT5jb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTE2NSwzMCArMTU3LDI5IEBACiAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgaW5wbGFjZSBlbmNyeXB0IjsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSB7Ci0gICAgICBsb2dfcHJvZ3Jlc3MoZGF0YSwgZmFsc2UpOworICAgICAgICBsb2dfcHJvZ3Jlc3MoZGF0YSwgZmFsc2UpOwogICAgIH0KIAogICAgIGRhdGEtPmNvdW50ID0gMDsKLSAgICBkYXRhLT5sYXN0X3dyaXR0ZW5fc2VjdG9yID0gKGRhdGEtPm9mZnNldCArIGRhdGEtPmNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIGluZm8uYmxvY2tfc2l6ZSAqIENSWVBUX1NFQ1RPUl9TSVpFIC0gMTsKKyAgICBkYXRhLT5sYXN0X3dyaXR0ZW5fc2VjdG9yID0KKyAgICAgICAgKGRhdGEtPm9mZnNldCArIGRhdGEtPmNvdW50KSAvIGluZm8uYmxvY2tfc2l6ZSAqIENSWVBUX1NFQ1RPUl9TSVpFIC0gMTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlbmNyeXB0X2dyb3VwcyhzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqIGRhdGEpCi17CitzdGF0aWMgaW50IGVuY3J5cHRfZ3JvdXBzKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogZGF0YSkgewogICAgIHVuc2lnbmVkIGludCBpOwotICAgIHU4ICpibG9ja19iaXRtYXAgPSAwOworICAgIHU4KiBibG9ja19iaXRtYXAgPSAwOwogICAgIHVuc2lnbmVkIGludCBibG9jazsKICAgICBvZmY2NF90IHJldDsKICAgICBpbnQgcmMgPSAtMTsKIAotICAgIGRhdGEtPmJ1ZmZlciA9IChjaGFyKikgbWFsbG9jKGluZm8uYmxvY2tfc2l6ZSAqIEJMT0NLU19BVF9BX1RJTUUpOworICAgIGRhdGEtPmJ1ZmZlciA9IChjaGFyKiltYWxsb2MoaW5mby5ibG9ja19zaXplICogQkxPQ0tTX0FUX0FfVElNRSk7CiAgICAgaWYgKCFkYXRhLT5idWZmZXIpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNyeXB0byBidWZmZXIiOwogICAgICAgICBnb3RvIGVycm91dDsKICAgICB9CiAKLSAgICBibG9ja19iaXRtYXAgPSAodTgqKSBtYWxsb2MoaW5mby5ibG9ja19zaXplKTsKKyAgICBibG9ja19iaXRtYXAgPSAodTgqKW1hbGxvYyhpbmZvLmJsb2NrX3NpemUpOwogICAgIGlmICghYmxvY2tfYml0bWFwKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgImZhaWxlZCB0byBhbGxvY2F0ZSBibG9jayBiaXRtYXAiOwogICAgICAgICBnb3RvIGVycm91dDsKQEAgLTE5OCwxMSArMTg5LDkgQEAKICAgICAgICAgTE9HKElORk8pIDw8ICJFbmNyeXB0aW5nIGdyb3VwICIgPDwgaTsKIAogICAgICAgICB1MzIgZmlyc3RfYmxvY2sgPSBhdXhfaW5mby5maXJzdF9kYXRhX2Jsb2NrICsgaSAqIGluZm8uYmxvY2tzX3Blcl9ncm91cDsKLSAgICAgICAgdTMyIGJsb2NrX2NvdW50ID0gc3RkOjptaW4oaW5mby5ibG9ja3NfcGVyX2dyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKShhdXhfaW5mby5sZW5fYmxvY2tzIC0gZmlyc3RfYmxvY2spKTsKKyAgICAgICAgdTMyIGJsb2NrX2NvdW50ID0gc3RkOjptaW4oaW5mby5ibG9ja3NfcGVyX2dyb3VwLCAodTMyKShhdXhfaW5mby5sZW5fYmxvY2tzIC0gZmlyc3RfYmxvY2spKTsKIAotICAgICAgICBvZmY2NF90IG9mZnNldCA9ICh1NjQpaW5mby5ibG9ja19zaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2Jsb2NrX2JpdG1hcDsKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAodTY0KWluZm8uYmxvY2tfc2l6ZSAqIGF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwOwogCiAgICAgICAgIHJldCA9IHByZWFkNjQoZGF0YS0+cmVhbGZkLCBibG9ja19iaXRtYXAsIGluZm8uYmxvY2tfc2l6ZSwgb2Zmc2V0KTsKICAgICAgICAgaWYgKHJldCAhPSAoaW50KWluZm8uYmxvY2tfc2l6ZSkgewpAQCAtMjE1LDggKzIwNCw5IEBACiAgICAgICAgIGRhdGEtPmNvdW50ID0gMDsKIAogICAgICAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBibG9ja19jb3VudDsgYmxvY2srKykgewotICAgICAgICAgICAgaW50IHVzZWQgPSAoYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19mbGFncyAmIEVYVDRfQkdfQkxPQ0tfVU5JTklUKSA/Ci0gICAgICAgICAgICAgICAgICAgIDAgOiBiaXRtYXBfZ2V0X2JpdChibG9ja19iaXRtYXAsIGJsb2NrKTsKKyAgICAgICAgICAgIGludCB1c2VkID0gKGF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfZmxhZ3MgJiBFWFQ0X0JHX0JMT0NLX1VOSU5JVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiaXRtYXBfZ2V0X2JpdChibG9ja19iaXRtYXAsIGJsb2NrKTsKICAgICAgICAgICAgIHVwZGF0ZV9wcm9ncmVzcyhkYXRhLCB1c2VkKTsKICAgICAgICAgICAgIGlmICh1c2VkKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRhdGEtPmNvdW50ID09IDApIHsKQEAgLTIzMiw4ICsyMjIsOCBAQAogICAgICAgICAgICAgb2Zmc2V0ICs9IGluZm8uYmxvY2tfc2l6ZTsKIAogICAgICAgICAgICAgLyogV3JpdGUgZGF0YSBpZiB3ZSBhcmUgYWxpZ25lZCBvciBidWZmZXIgc2l6ZSByZWFjaGVkICovCi0gICAgICAgICAgICBpZiAob2Zmc2V0ICUgKGluZm8uYmxvY2tfc2l6ZSAqIEJMT0NLU19BVF9BX1RJTUUpID09IDAKLSAgICAgICAgICAgICAgICB8fCBkYXRhLT5jb3VudCA9PSBCTE9DS1NfQVRfQV9USU1FKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ICUgKGluZm8uYmxvY2tfc2l6ZSAqIEJMT0NLU19BVF9BX1RJTUUpID09IDAgfHwKKyAgICAgICAgICAgICAgICBkYXRhLT5jb3VudCA9PSBCTE9DS1NfQVRfQV9USU1FKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZsdXNoX291dHN0YW5kaW5nX2RhdGEoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvdXQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjYwLDcgKzI1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldF9wcm9ncmVzc19wcm9wZXJ0aWVzKSB7CiAgICAgdTMyIGk7CiAgICAgc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhIGRhdGE7Ci0gICAgaW50IHJjOyAvLyBDYW4ndCBpbml0aWFsaXplIHdpdGhvdXQgY2F1c2luZyB3YXJuaW5nIC1XY2xvYmJlcmVkCisgICAgaW50IHJjOyAgLy8gQ2FuJ3QgaW5pdGlhbGl6ZSB3aXRob3V0IGNhdXNpbmcgd2FybmluZyAtV2Nsb2JiZXJlZAogICAgIGludCByZXRyaWVzID0gUkVUUllfTU9VTlRfQVRURU1QVFM7CiAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVfc3RhcnRlZCA9IHswfTsKIApAQCAtMjc1LDcgKzI2NSw3IEBACiAgICAgZGF0YS5zZXRfcHJvZ3Jlc3NfcHJvcGVydGllcyA9IHNldF9wcm9ncmVzc19wcm9wZXJ0aWVzOwogCiAgICAgTE9HKERFQlVHKSA8PCAiT3BlbmluZyIgPDwgcmVhbF9ibGtkZXY7Ci0gICAgaWYgKCAoZGF0YS5yZWFsZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JEV1J8T19DTE9FWEVDKSkgPCAwKSB7CisgICAgaWYgKChkYXRhLnJlYWxmZCA9IG9wZW4ocmVhbF9ibGtkZXYsIE9fUkRXUiB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3Igb3BlbmluZyByZWFsX2Jsa2RldiAiIDw8IHJlYWxfYmxrZGV2IDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIHJjID0gLTE7CiAgICAgICAgIGdvdG8gZXJyb3V0OwpAQCAtMjgzLDcgKzI3Myw3IEBACiAKICAgICBMT0coREVCVUcpIDw8ICJPcGVuaW5nIiA8PCBjcnlwdG9fYmxrZGV2OwogICAgIC8vIFdhaXQgdW50aWwgdGhlIGJsb2NrIGRldmljZSBhcHBlYXJzLiAgUmUtdXNlIHRoZSBtb3VudCByZXRyeSB2YWx1ZXMgc2luY2UgaXQgaXMgcmVhc29uYWJsZS4KLSAgICB3aGlsZSAoKGRhdGEuY3J5cHRvZmQgPSBvcGVuKGNyeXB0b19ibGtkZXYsIE9fV1JPTkxZfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIHdoaWxlICgoZGF0YS5jcnlwdG9mZCA9IG9wZW4oY3J5cHRvX2Jsa2RldiwgT19XUk9OTFkgfCBPX0NMT0VYRUMpKSA8IDApIHsKICAgICAgICAgaWYgKC0tcmV0cmllcykgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkVycm9yIG9wZW5pbmcgY3J5cHRvX2Jsa2RldiAiIDw8IGNyeXB0b19ibGtkZXYKICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGV4dDQgaW5wbGFjZSBlbmNyeXB0LCByZXRyeWluZyI7CkBAIC0yOTYsNyArMjg2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChzZXRqbXAoc2V0am1wX2VudikpIHsgLy8gTk9MSU5UCisgICAgaWYgKHNldGptcChzZXRqbXBfZW52KSkgeyAgLy8gTk9MSU5UCiAgICAgICAgIExPRyhFUlJPUikgPDwgIlJlYWRpbmcgZXh0NCBleHRlbnQgY2F1c2VkIGFuIGV4Y2VwdGlvbiI7CiAgICAgICAgIHJjID0gLTE7CiAgICAgICAgIGdvdG8gZXJyb3V0OwpAQCAtMzE2LDcgKzMwNiw3IEBACiAKICAgICBkYXRhLnRvdF91c2VkX2Jsb2NrcyA9IGRhdGEubnVtYmxvY2tzOwogICAgIGZvciAoaSA9IDA7IGkgPCBhdXhfaW5mby5ncm91cHM7ICsraSkgewotICAgICAgZGF0YS50b3RfdXNlZF9ibG9ja3MgLT0gYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19mcmVlX2Jsb2Nrc19jb3VudDsKKyAgICAgICAgZGF0YS50b3RfdXNlZF9ibG9ja3MgLT0gYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19mcmVlX2Jsb2Nrc19jb3VudDsKICAgICB9CiAKICAgICBkYXRhLm9uZV9wY3QgPSBkYXRhLnRvdF91c2VkX2Jsb2NrcyAvIDEwMDsKQEAgLTM0NSw4ICszMzUsNyBAQAogICAgIHJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgbG9nX3Byb2dyZXNzX2YyZnModTY0IGJsb2NrLCBib29sIGNvbXBsZXRlZCkKLXsKK3N0YXRpYyB2b2lkIGxvZ19wcm9ncmVzc19mMmZzKHU2NCBibG9jaywgYm9vbCBjb21wbGV0ZWQpIHsKICAgICAvLyBQcmVjb25kaXRpb24gLSBpZiBjb21wbGV0ZWQgZGF0YSA9IDAgZWxzZSBkYXRhICE9IDAKIAogICAgIC8vIFRyYWNrIHByb2dyZXNzIHNvIHdlIGNhbiBza2lwIGxvZ2dpbmcgYmxvY2tzCkBAIC0zNjksOSArMzU4LDggQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgZW5jcnlwdF9vbmVfYmxvY2tfZjJmcyh1NjQgcG9zLCB2b2lkICpkYXRhKQotewotICAgIHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSAqcHJpdl9kYXQgPSAoc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhICopZGF0YTsKK3N0YXRpYyBpbnQgZW5jcnlwdF9vbmVfYmxvY2tfZjJmcyh1NjQgcG9zLCB2b2lkKiBkYXRhKSB7CisgICAgc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKiBwcml2X2RhdCA9IChzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqKWRhdGE7CiAKICAgICBwcml2X2RhdC0+YmxvY2tzX2FscmVhZHlfZG9uZSA9IHBvcyAtIDE7CiAgICAgdXBkYXRlX3Byb2dyZXNzKHByaXZfZGF0LCAxKTsKQEAgLTQwMCw3ICszODgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBwcmV2aW91c2x5X2VuY3J5cHRlZF91cHRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXRfcHJvZ3Jlc3NfcHJvcGVydGllcykgewogICAgIHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSBkYXRhOwotICAgIHN0cnVjdCBmMmZzX2luZm8gKmYyZnNfaW5mbyA9IE5VTEw7CisgICAgc3RydWN0IGYyZnNfaW5mbyogZjJmc19pbmZvID0gTlVMTDsKICAgICBpbnQgcmMgPSBFTkFCTEVfSU5QTEFDRV9FUlJfT1RIRVI7CiAgICAgaWYgKHByZXZpb3VzbHlfZW5jcnlwdGVkX3VwdG8gPiAqc2l6ZV9hbHJlYWR5X2RvbmUpIHsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiTm90IGZhc3QgZW5jcnlwdGluZyBzaW5jZSByZXN1bWluZyBwYXJ0IHdheSB0aHJvdWdoIjsKQEAgLTQxMiwxMSArNDAwLDExIEBACiAgICAgZGF0YS5zZXRfcHJvZ3Jlc3NfcHJvcGVydGllcyA9IHNldF9wcm9ncmVzc19wcm9wZXJ0aWVzOwogICAgIGRhdGEucmVhbGZkID0gLTE7CiAgICAgZGF0YS5jcnlwdG9mZCA9IC0xOwotICAgIGlmICggKGRhdGEucmVhbGZkID0gb3BlbjY0KHJlYWxfYmxrZGV2LCBPX1JEV1J8T19DTE9FWEVDKSkgPCAwKSB7CisgICAgaWYgKChkYXRhLnJlYWxmZCA9IG9wZW42NChyZWFsX2Jsa2RldiwgT19SRFdSIHwgT19DTE9FWEVDKSkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciBvcGVuaW5nIHJlYWxfYmxrZGV2ICIgPDwgcmVhbF9ibGtkZXYgPDwgIiBmb3IgZjJmcyBpbnBsYWNlIGVuY3J5cHQiOwogICAgICAgICBnb3RvIGVycm91dDsKICAgICB9Ci0gICAgaWYgKCAoZGF0YS5jcnlwdG9mZCA9IG9wZW42NChjcnlwdG9fYmxrZGV2LCBPX1dST05MWXxPX0NMT0VYRUMpKSA8IDApIHsKKyAgICBpZiAoKGRhdGEuY3J5cHRvZmQgPSBvcGVuNjQoY3J5cHRvX2Jsa2RldiwgT19XUk9OTFkgfCBPX0NMT0VYRUMpKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkVycm9yIG9wZW5pbmcgY3J5cHRvX2Jsa2RldiAiIDw8IGNyeXB0b19ibGtkZXYKICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgZjJmcyBpbnBsYWNlIGVuY3J5cHQiOwogICAgICAgICByYyA9IEVOQUJMRV9JTlBMQUNFX0VSUl9ERVY7CkBAIC00MjQsOCArNDEyLDcgQEAKICAgICB9CiAKICAgICBmMmZzX2luZm8gPSBnZW5lcmF0ZV9mMmZzX2luZm8oZGF0YS5yZWFsZmQpOwotICAgIGlmICghZjJmc19pbmZvKQotICAgICAgZ290byBlcnJvdXQ7CisgICAgaWYgKCFmMmZzX2luZm8pIGdvdG8gZXJyb3V0OwogCiAgICAgZGF0YS5udW1ibG9ja3MgPSBzaXplIC8gQ1JZUFRfU0VDVE9SU19QRVJfQlVGU0laRTsKICAgICBkYXRhLnRvdF9udW1ibG9ja3MgPSB0b3Rfc2l6ZSAvIENSWVBUX1NFQ1RPUlNfUEVSX0JVRlNJWkU7CkBAIC00MzgsNyArNDI1LDcgQEAKICAgICBkYXRhLnRpbWVfc3RhcnRlZCA9IHRpbWUoTlVMTCk7CiAgICAgZGF0YS5yZW1haW5pbmdfdGltZSA9IC0xOwogCi0gICAgZGF0YS5idWZmZXIgPSAoY2hhciopIG1hbGxvYyhmMmZzX2luZm8tPmJsb2NrX3NpemUpOworICAgIGRhdGEuYnVmZmVyID0gKGNoYXIqKW1hbGxvYyhmMmZzX2luZm8tPmJsb2NrX3NpemUpOwogICAgIGlmICghZGF0YS5idWZmZXIpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNyeXB0byBidWZmZXIiOwogICAgICAgICBnb3RvIGVycm91dDsKQEAgLTQ3NSwxOCArNDYyLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IHByZXZpb3VzbHlfZW5jcnlwdGVkX3VwdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldF9wcm9ncmVzc19wcm9wZXJ0aWVzKSB7CiAgICAgaW50IHJlYWxmZCwgY3J5cHRvZmQ7Ci0gICAgY2hhciAqYnVmW0NSWVBUX0lOUExBQ0VfQlVGU0laRV07CisgICAgY2hhciogYnVmW0NSWVBUX0lOUExBQ0VfQlVGU0laRV07CiAgICAgaW50IHJjID0gRU5BQkxFX0lOUExBQ0VfRVJSX09USEVSOwogICAgIG9mZjY0X3QgbnVtYmxvY2tzLCBpLCByZW1haW5kZXI7CiAgICAgb2ZmNjRfdCBvbmVfcGN0LCBjdXJfcGN0LCBuZXdfcGN0OwogICAgIG9mZjY0X3QgYmxvY2tzX2FscmVhZHlfZG9uZSwgdG90X251bWJsb2NrczsKIAotICAgIGlmICggKHJlYWxmZCA9IG9wZW4ocmVhbF9ibGtkZXYsIE9fUkRPTkxZfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIGlmICgocmVhbGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkVycm9yIG9wZW5pbmcgcmVhbF9ibGtkZXYgIiA8PCByZWFsX2Jsa2RldiA8PCAiIGZvciBpbnBsYWNlIGVuY3J5cHQiOwogICAgICAgICByZXR1cm4gRU5BQkxFX0lOUExBQ0VfRVJSX09USEVSOwogICAgIH0KIAotICAgIGlmICggKGNyeXB0b2ZkID0gb3BlbihjcnlwdG9fYmxrZGV2LCBPX1dST05MWXxPX0NMT0VYRUMpKSA8IDApIHsKKyAgICBpZiAoKGNyeXB0b2ZkID0gb3BlbihjcnlwdG9fYmxrZGV2LCBPX1dST05MWSB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3Igb3BlbmluZyBjcnlwdG9fYmxrZGV2ICIgPDwgY3J5cHRvX2Jsa2RldiA8PCAiIGZvciBpbnBsYWNlIGVuY3J5cHQiOwogICAgICAgICBjbG9zZShyZWFsZmQpOwogICAgICAgICByZXR1cm4gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVjsKQEAgLTUxNiw3ICs1MDMsNyBAQAogICAgICAgICBnb3RvIGVycm91dDsKICAgICB9CiAKLSAgICBmb3IgKDtpIDwgc2l6ZSAmJiBpICUgQ1JZUFRfU0VDVE9SU19QRVJfQlVGU0laRSAhPSAwOyArK2kpIHsKKyAgICBmb3IgKDsgaSA8IHNpemUgJiYgaSAlIENSWVBUX1NFQ1RPUlNfUEVSX0JVRlNJWkUgIT0gMDsgKytpKSB7CiAgICAgICAgIGlmICh1bml4X3JlYWQocmVhbGZkLCBidWYsIENSWVBUX1NFQ1RPUl9TSVpFKSA8PSAwKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3IgcmVhZGluZyBpbml0aWFsIHNlY3RvcnMgZnJvbSByZWFsX2Jsa2RldiAiIDw8IHJlYWxfYmxrZGV2CiAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBpbnBsYWNlIGVuY3J5cHQiOwpAQCAtNTM0LDcgKzUyMSw3IEBACiAgICAgb25lX3BjdCA9IHRvdF9udW1ibG9ja3MgLyAxMDA7CiAgICAgY3VyX3BjdCA9IDA7CiAgICAgLyogcHJvY2VzcyB0aGUgbWFqb3JpdHkgb2YgdGhlIGZpbGVzeXN0ZW0gaW4gYmxvY2tzICovCi0gICAgZm9yIChpLz1DUllQVF9TRUNUT1JTX1BFUl9CVUZTSVpFOyBpPG51bWJsb2NrczsgaSsrKSB7CisgICAgZm9yIChpIC89IENSWVBUX1NFQ1RPUlNfUEVSX0JVRlNJWkU7IGkgPCBudW1ibG9ja3M7IGkrKykgewogICAgICAgICBuZXdfcGN0ID0gKGkgKyBibG9ja3NfYWxyZWFkeV9kb25lKSAvIG9uZV9wY3Q7CiAgICAgICAgIGlmIChzZXRfcHJvZ3Jlc3NfcHJvcGVydGllcyAmJiBuZXdfcGN0ID4gY3VyX3BjdCkgewogICAgICAgICAgICAgY2hhciBidWZbOF07CkBAIC01NTcsNyArNTQ0LDcgQEAKICAgICB9CiAKICAgICAvKiBEbyBhbnkgcmVtYWluaW5nIHNlY3RvcnMgKi8KLSAgICBmb3IgKGk9MDsgaTxyZW1haW5kZXI7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCByZW1haW5kZXI7IGkrKykgewogICAgICAgICBpZiAodW5peF9yZWFkKHJlYWxmZCwgYnVmLCBDUllQVF9TRUNUT1JfU0laRSkgPD0gMCkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgcmVhZGluZyBmaW5hbCBzZWN0b3JzIGZyb20gcmVhbF9ibGtkZXYgIiA8PCByZWFsX2Jsa2RldgogICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBpbnBsYWNlIGVuY3J5cHQiOwpAQCAtNjI2LDkgKzYxMyw4IEBACiAgICAgTE9HKERFQlVHKSA8PCAiY3J5cHRmc19lbmFibGVfaW5wbGFjZV9mdWxsKCk9IiA8PCByY19mdWxsOwogCiAgICAgLyogSGFjayBmb3IgYi8xNzg5ODk2MiwgdGhlIGZvbGxvd2luZyBpcyB0aGUgc3ltcHRvbS4uLiAqLwotICAgIGlmIChyY19leHQ0ID09IEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYKLSAgICAgICAgJiYgcmNfZjJmcyA9PSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWCi0gICAgICAgICYmIHJjX2Z1bGwgPT0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVikgeworICAgIGlmIChyY19leHQ0ID09IEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYgJiYgcmNfZjJmcyA9PSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWICYmCisgICAgICAgIHJjX2Z1bGwgPT0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVikgewogICAgICAgICBMT0coREVCVUcpIDw8ICJFTkFCTEVfSU5QTEFDRV9FUlJfREVWIjsKICAgICAgICAgcmV0dXJuIEVOQUJMRV9JTlBMQUNFX0VSUl9ERVY7CiAgICAgfQpkaWZmIC0tZ2l0IGEvRXh0NENyeXB0LmNwcCBiL0V4dDRDcnlwdC5jcHAKaW5kZXggNjdiN2U5MC4uMjEwNzFkNCAxMDA2NDQKLS0tIGEvRXh0NENyeXB0LmNwcAorKysgYi9FeHQ0Q3J5cHQuY3BwCkBAIC0zMSwxMiArMzEsMTIgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCkBAIC05Myw3ICs5Myw3IEBACiAvLyBUT0RPIGFib2xpc2ggdGhpcyBtYXAsIHBlciBiLzI2OTQ4MDUzCiBzdGQ6Om1hcDx1c2VyaWRfdCwgS2V5QnVmZmVyPiBzX2NlX2tleXM7CiAKLX0KK30gIC8vIG5hbWVzcGFjZQogCiBzdGF0aWMgYm9vbCBlNGNyeXB0X2lzX2VtdWxhdGVkKCkgewogICAgIHJldHVybiBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5zeXMuZW11bGF0ZV9mYmUiLCBmYWxzZSk7CkBAIC0xNDUsOCArMTQ1LDcgQEAKIH0KIAogc3RhdGljIGJvb2wgZ2V0X2NlX2tleV9uZXdfcGF0aChjb25zdCBzdGQ6OnN0cmluZyYgZGlyZWN0b3J5X3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGF0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjZV9rZXlfcGF0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHBhdGhzLCBzdGQ6OnN0cmluZyogY2Vfa2V5X3BhdGgpIHsKICAgICBpZiAocGF0aHMuZW1wdHkoKSkgewogICAgICAgICAqY2Vfa2V5X3BhdGggPSBnZXRfY2Vfa2V5X2N1cnJlbnRfcGF0aChkaXJlY3RvcnlfcGF0aCk7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTYzLDkgKzE2Miw5IEBACiAKIC8vIERpc2NhcmQgYWxsIGtleXMgYnV0IHRoZSBuYW1lZCBvbmU7IHJlbmFtZSBpdCB0byBjYW5vbmljYWwgbmFtZS4KIC8vIE5vIHBvaW50IGluIGFjdGluZyBvbiBlcnJvcnMgaW4gdGhpczsgaWdub3JlIHRoZW0uCi1zdGF0aWMgdm9pZCBmaXhhdGVfdXNlcl9jZV9rZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcmVjdG9yeV9wYXRoLCBjb25zdCBzdGQ6OnN0cmluZyAmdG9fZml4LAorc3RhdGljIHZvaWQgZml4YXRlX3VzZXJfY2Vfa2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJlY3RvcnlfcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRvX2ZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHBhdGhzKSB7Ci0gICAgZm9yIChhdXRvIGNvbnN0IG90aGVyX3BhdGg6IHBhdGhzKSB7CisgICAgZm9yIChhdXRvIGNvbnN0IG90aGVyX3BhdGggOiBwYXRocykgewogICAgICAgICBpZiAob3RoZXJfcGF0aCAhPSB0b19maXgpIHsKICAgICAgICAgICAgIGFuZHJvaWQ6OnZvbGQ6OmRlc3Ryb3lLZXkob3RoZXJfcGF0aCk7CiAgICAgICAgIH0KQEAgLTE4MSwxMCArMTgwLDEwIEBACiAKIHN0YXRpYyBib29sIHJlYWRfYW5kX2ZpeGF0ZV91c2VyX2NlX2tleSh1c2VyaWRfdCB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnZvbGQ6OktleUF1dGhlbnRpY2F0aW9uJiBhdXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUJ1ZmZlciAqY2Vfa2V5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5QnVmZmVyKiBjZV9rZXkpIHsKICAgICBhdXRvIGNvbnN0IGRpcmVjdG9yeV9wYXRoID0gZ2V0X2NlX2tleV9kaXJlY3RvcnlfcGF0aCh1c2VyX2lkKTsKICAgICBhdXRvIGNvbnN0IHBhdGhzID0gZ2V0X2NlX2tleV9wYXRocyhkaXJlY3RvcnlfcGF0aCk7Ci0gICAgZm9yIChhdXRvIGNvbnN0IGNlX2tleV9wYXRoOiBwYXRocykgeworICAgIGZvciAoYXV0byBjb25zdCBjZV9rZXlfcGF0aCA6IHBhdGhzKSB7CiAgICAgICAgIExPRyhERUJVRykgPDwgIlRyeWluZyB1c2VyIENFIGtleSAiIDw8IGNlX2tleV9wYXRoOwogICAgICAgICBpZiAoYW5kcm9pZDo6dm9sZDo6cmV0cmlldmVLZXkoY2Vfa2V5X3BhdGgsIGF1dGgsIGNlX2tleSkpIHsKICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQga2V5IjsKQEAgLTI0MiwxMiArMjQxLDE0IEBACiAgICAgICAgIGF1dG8gY29uc3QgcGF0aHMgPSBnZXRfY2Vfa2V5X3BhdGhzKGRpcmVjdG9yeV9wYXRoKTsKICAgICAgICAgc3RkOjpzdHJpbmcgY2Vfa2V5X3BhdGg7CiAgICAgICAgIGlmICghZ2V0X2NlX2tleV9uZXdfcGF0aChkaXJlY3RvcnlfcGF0aCwgcGF0aHMsICZjZV9rZXlfcGF0aCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjp2b2xkOjpzdG9yZUtleUF0b21pY2FsbHkoY2Vfa2V5X3BhdGgsIHVzZXJfa2V5X3RlbXAsCi0gICAgICAgICAgICAgICAga0VtcHR5QXV0aGVudGljYXRpb24sIGNlX2tleSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjp2b2xkOjpzdG9yZUtleUF0b21pY2FsbHkoY2Vfa2V5X3BhdGgsIHVzZXJfa2V5X3RlbXAsIGtFbXB0eUF1dGhlbnRpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZV9rZXkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBmaXhhdGVfdXNlcl9jZV9rZXkoZGlyZWN0b3J5X3BhdGgsIGNlX2tleV9wYXRoLCBwYXRocyk7CiAgICAgICAgIC8vIFdyaXRlIERFIGtleSBzZWNvbmQ7IG9uY2UgdGhpcyBpcyB3cml0dGVuLCBhbGwgaXMgZ29vZC4KICAgICAgICAgaWYgKCFhbmRyb2lkOjp2b2xkOjpzdG9yZUtleUF0b21pY2FsbHkoZ2V0X2RlX2tleV9wYXRoKHVzZXJfaWQpLCB1c2VyX2tleV90ZW1wLAotICAgICAgICAgICAgICAgIGtFbXB0eUF1dGhlbnRpY2F0aW9uLCBkZV9rZXkpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFbXB0eUF1dGhlbnRpY2F0aW9uLCBkZV9rZXkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBkZV9yYXdfcmVmOwogICAgIGlmICghYW5kcm9pZDo6dm9sZDo6aW5zdGFsbEtleShkZV9rZXksICZkZV9yYXdfcmVmKSkgcmV0dXJuIGZhbHNlOwpAQCAtNDQwLDE0ICs0NDEsMTQgQEAKICAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwogICAgIHN0ZDo6c3RyaW5nIHJhd19yZWY7CiAgICAgc3VjY2VzcyAmPSBldmljdF9jZV9rZXkodXNlcl9pZCk7Ci0gICAgc3VjY2VzcyAmPSBsb29rdXBfa2V5X3JlZihzX2RlX2tleV9yYXdfcmVmcywgdXNlcl9pZCwgJnJhd19yZWYpCi0gICAgICAgICYmIGFuZHJvaWQ6OnZvbGQ6OmV2aWN0S2V5KHJhd19yZWYpOworICAgIHN1Y2Nlc3MgJj0KKyAgICAgICAgbG9va3VwX2tleV9yZWYoc19kZV9rZXlfcmF3X3JlZnMsIHVzZXJfaWQsICZyYXdfcmVmKSAmJiBhbmRyb2lkOjp2b2xkOjpldmljdEtleShyYXdfcmVmKTsKICAgICBzX2RlX2tleV9yYXdfcmVmcy5lcmFzZSh1c2VyX2lkKTsKICAgICBhdXRvIGl0ID0gc19lcGhlbWVyYWxfdXNlcnMuZmluZCh1c2VyX2lkKTsKICAgICBpZiAoaXQgIT0gc19lcGhlbWVyYWxfdXNlcnMuZW5kKCkpIHsKICAgICAgICAgc19lcGhlbWVyYWxfdXNlcnMuZXJhc2UoaXQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoYXV0byBjb25zdCBwYXRoOiBnZXRfY2Vfa2V5X3BhdGhzKGdldF9jZV9rZXlfZGlyZWN0b3J5X3BhdGgodXNlcl9pZCkpKSB7CisgICAgICAgIGZvciAoYXV0byBjb25zdCBwYXRoIDogZ2V0X2NlX2tleV9wYXRocyhnZXRfY2Vfa2V5X2RpcmVjdG9yeV9wYXRoKHVzZXJfaWQpKSkgewogICAgICAgICAgICAgc3VjY2VzcyAmPSBhbmRyb2lkOjp2b2xkOjpkZXN0cm95S2V5KHBhdGgpOwogICAgICAgICB9CiAgICAgICAgIGF1dG8gZGVfa2V5X3BhdGggPSBnZXRfZGVfa2V5X3BhdGgodXNlcl9pZCk7CkBAIC01NTYsMTQgKzU1NywxNCBAQAogICAgIHN0ZDo6c3RyaW5nIHRva2VuLCBzZWNyZXQ7CiAgICAgaWYgKCFwYXJzZV9oZXgodG9rZW5faGV4LCAmdG9rZW4pKSByZXR1cm4gZmFsc2U7CiAgICAgaWYgKCFwYXJzZV9oZXgoc2VjcmV0X2hleCwgJnNlY3JldCkpIHJldHVybiBmYWxzZTsKLSAgICBhdXRvIGF1dGggPSBzZWNyZXQuZW1wdHkoKSA/IGtFbXB0eUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYW5kcm9pZDo6dm9sZDo6S2V5QXV0aGVudGljYXRpb24odG9rZW4sIHNlY3JldCk7CisgICAgYXV0byBhdXRoID0KKyAgICAgICAgc2VjcmV0LmVtcHR5KCkgPyBrRW1wdHlBdXRoZW50aWNhdGlvbiA6IGFuZHJvaWQ6OnZvbGQ6OktleUF1dGhlbnRpY2F0aW9uKHRva2VuLCBzZWNyZXQpOwogICAgIGF1dG8gaXQgPSBzX2NlX2tleXMuZmluZCh1c2VyX2lkKTsKICAgICBpZiAoaXQgPT0gc19jZV9rZXlzLmVuZCgpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIktleSBub3QgbG9hZGVkIGludG8gbWVtb3J5LCBjYW4ndCBjaGFuZ2UgZm9yIHVzZXIgIiA8PCB1c2VyX2lkOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGNvbnN0IGF1dG8gJmNlX2tleSA9IGl0LT5zZWNvbmQ7CisgICAgY29uc3QgYXV0byYgY2Vfa2V5ID0gaXQtPnNlY29uZDsKICAgICBhdXRvIGNvbnN0IGRpcmVjdG9yeV9wYXRoID0gZ2V0X2NlX2tleV9kaXJlY3RvcnlfcGF0aCh1c2VyX2lkKTsKICAgICBhdXRvIGNvbnN0IHBhdGhzID0gZ2V0X2NlX2tleV9wYXRocyhkaXJlY3RvcnlfcGF0aCk7CiAgICAgc3RkOjpzdHJpbmcgY2Vfa2V5X3BhdGg7CkBAIC02NzAsNyArNjcxLDggQEAKICAgICAgICAgICAgIGlmICghcHJlcGFyZV9kaXIoc3lzdGVtX2xlZ2FjeV9wYXRoLCAwNzAwLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSkgcmV0dXJuIGZhbHNlOwogI2lmIE1BTkFHRV9NSVNDX0RJUlMKICAgICAgICAgICAgIGlmICghcHJlcGFyZV9kaXIobWlzY19sZWdhY3lfcGF0aCwgMDc1MCwgbXVsdGl1c2VyX2dldF91aWQodXNlcl9pZCwgQUlEX1NZU1RFTSksCi0gICAgICAgICAgICAgICAgICAgIG11bHRpdXNlcl9nZXRfdWlkKHVzZXJfaWQsIEFJRF9FVkVSWUJPRFkpKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXVzZXJfZ2V0X3VpZCh1c2VyX2lkLCBBSURfRVZFUllCT0RZKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogI2VuZGlmCiAgICAgICAgICAgICBpZiAoIXByZXBhcmVfZGlyKHByb2ZpbGVzX2RlX3BhdGgsIDA3NzEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pKSByZXR1cm4gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL0ZpbGVEZXZpY2VVdGlscy5jcHAgYi9GaWxlRGV2aWNlVXRpbHMuY3BwCmluZGV4IGJjOWY0YmQuLmNlOTM4YTkgMTAwNjQ0Ci0tLSBhL0ZpbGVEZXZpY2VVdGlscy5jcHAKKysrIGIvRmlsZURldmljZVV0aWxzLmNwcApAQCAtMTYsMTUgKzE2LDE1IEBACiAKICNpbmNsdWRlICJGaWxlRGV2aWNlVXRpbHMuaCIKIAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPG1udGVudC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4KLSNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KQEAgLTQwLDM4ICs0MCwzMyBAQAogbmFtZXNwYWNlIHZvbGQgewogCiAvLyBHaXZlbiBhIGZpbGUgcGF0aCwgbG9vayBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgZGV2aWNlIGluIC9wcm9jL21vdW50Ci1zdGQ6OnN0cmluZyBCbG9ja0RldmljZUZvclBhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpCi17Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGludCgqKShGSUxFKik+IG1udHMoc2V0bW50ZW50KCIvcHJvYy9tb3VudHMiLCAicmUiKSwgZW5kbW50ZW50KTsKK3N0ZDo6c3RyaW5nIEJsb2NrRGV2aWNlRm9yUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBpbnQgKCopKEZJTEUqKT4gbW50cyhzZXRtbnRlbnQoIi9wcm9jL21vdW50cyIsICJyZSIpLCBlbmRtbnRlbnQpOwogICAgIGlmICghbW50cykgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG9wZW4gL3Byb2MvbW91bnRzIjsKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CiAgICAgc2l6ZV90IGJlc3RfbGVuZ3RoID0gMDsKLSAgICBzdHJ1Y3QgbW50ZW50ICptbnQ7IC8vIGdldG1udGVudCByZXR1cm5zIGEgdGhyZWFkIGxvY2FsLCBzbyBpdCdzIHNhZmUuCisgICAgc3RydWN0IG1udGVudCogbW50OyAgLy8gZ2V0bW50ZW50IHJldHVybnMgYSB0aHJlYWQgbG9jYWwsIHNvIGl0J3Mgc2FmZS4KICAgICB3aGlsZSAoKG1udCA9IGdldG1udGVudChtbnRzLmdldCgpKSkgIT0gbnVsbHB0cikgewogICAgICAgICBhdXRvIGwgPSBzdHJsZW4obW50LT5tbnRfZGlyKTsKLSAgICAgICAgaWYgKGwgPiBiZXN0X2xlbmd0aCAmJgotICAgICAgICAgICAgcGF0aC5zaXplKCkgPiBsICYmCi0gICAgICAgICAgICBwYXRoW2xdID09ICcvJyAmJgorICAgICAgICBpZiAobCA+IGJlc3RfbGVuZ3RoICYmIHBhdGguc2l6ZSgpID4gbCAmJiBwYXRoW2xdID09ICcvJyAmJgogICAgICAgICAgICAgcGF0aC5jb21wYXJlKDAsIGwsIG1udC0+bW50X2RpcikgPT0gMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1udC0+bW50X2ZzbmFtZTsKLSAgICAgICAgICAgICAgICBiZXN0X2xlbmd0aCA9IGw7CisgICAgICAgICAgICByZXN1bHQgPSBtbnQtPm1udF9mc25hbWU7CisgICAgICAgICAgICBiZXN0X2xlbmd0aCA9IGw7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlc3VsdC5lbXB0eSgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwiRGlkbid0IGZpbmQgYSBtb3VudHBvaW50IHRvIG1hdGNoIHBhdGggIiA8PCBwYXRoOworICAgICAgICBMT0coRVJST1IpIDw8ICJEaWRuJ3QgZmluZCBhIG1vdW50cG9pbnQgdG8gbWF0Y2ggcGF0aCAiIDw8IHBhdGg7CiAgICAgICAgIHJldHVybiAiIjsKICAgICB9CiAgICAgTE9HKERFQlVHKSA8PCAiRm9yIHBhdGggIiA8PCBwYXRoIDw8ICIgYmxvY2sgZGV2aWNlIGlzICIgPDwgcmVzdWx0OwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiBQYXRoRmllbWFwKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoLCB1aW50MzJfdCBleHRlbnRfY291bnQpCi17Ci0gICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKAotICAgICAgICBwYXRoLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDLCAwKSkpOworc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IFBhdGhGaWVtYXAoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHVpbnQzMl90IGV4dGVudF9jb3VudCkgeworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihwYXRoLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDLCAwKSkpOwogICAgIGlmIChmZCA9PSAtMSkgewogICAgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UKSB7CiAgICAgICAgICAgICBQTE9HKERFQlVHKSA8PCAiVW5hYmxlIHRvIG9wZW4gIiA8PCBwYXRoOwpAQCAtODgsNyArODMsNyBAQAogICAgIGF1dG8gbWFwcGVkID0gZmllbWFwLT5mbV9tYXBwZWRfZXh0ZW50czsKICAgICBpZiAobWFwcGVkIDwgMSB8fCBtYXBwZWQgPiBleHRlbnRfY291bnQpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXh0ZW50IGNvdW50IG5vdCBpbiBib3VuZHMgMSA8PSAiIDw8IG1hcHBlZCA8PCAiIDw9ICIgPDwgZXh0ZW50X2NvdW50Ci0gICAgICAgICAgICA8PCAiIGluICIgPDwgcGF0aDsKKyAgICAgICAgICAgICAgICAgICA8PCAiIGluICIgPDwgcGF0aDsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogICAgIHJldHVybiBmaWVtYXA7CkBAIC05OSwxMCArOTQsOSBAQAogCiBuYW1lc3BhY2UgewogCi1zdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gYWxsb2NfZmllbWFwKHVpbnQzMl90IGV4dGVudF9jb3VudCkKLXsKK3N0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiBhbGxvY19maWVtYXAodWludDMyX3QgZXh0ZW50X2NvdW50KSB7CiAgICAgc2l6ZV90IGFsbG9jc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBmaWVtYXAsIGZtX2V4dGVudHNbZXh0ZW50X2NvdW50XSk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IHJlcyhuZXcgKDo6b3BlcmF0b3IgbmV3IChhbGxvY3NpemUpKSBzdHJ1Y3QgZmllbWFwKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gcmVzKG5ldyAoOjpvcGVyYXRvciBuZXcoYWxsb2NzaXplKSkgc3RydWN0IGZpZW1hcCk7CiAgICAgbWVtc2V0KHJlcy5nZXQoKSwgMCwgYWxsb2NzaXplKTsKICAgICByZXMtPmZtX3N0YXJ0ID0gMDsKICAgICByZXMtPmZtX2xlbmd0aCA9IFVJTlQ2NF9NQVg7CkBAIC0xMTIsNCArMTA2LDQgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi19Cit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL0ZpbGVEZXZpY2VVdGlscy5oIGIvRmlsZURldmljZVV0aWxzLmgKaW5kZXggNGMxZDQ5YS4uNDQyOGNlZiAxMDA2NDQKLS0tIGEvRmlsZURldmljZVV0aWxzLmgKKysrIGIvRmlsZURldmljZVV0aWxzLmgKQEAgLTE3LDE3ICsxNywxNyBAQAogI2lmbmRlZiBBTkRST0lEX1ZPTERfRklMRURFVklDRVVUSUxTX0gKICNkZWZpbmUgQU5EUk9JRF9WT0xEX0ZJTEVERVZJQ0VVVElMU19ICiAKLSNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bGludXgvZmllbWFwLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CiAKIC8vIEdpdmVuIGEgZmlsZSBwYXRoLCBsb29rIGZvciB0aGUgY29ycmVzcG9uZGluZyBibG9jayBkZXZpY2UgaW4gL3Byb2MvbW91bnQKLXN0ZDo6c3RyaW5nIEJsb2NrRGV2aWNlRm9yUGF0aChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCk7CitzdGQ6OnN0cmluZyBCbG9ja0RldmljZUZvclBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwogCiAvLyBSZWFkIHRoZSBmaWxlJ3MgRklFTUFQCi1zdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gUGF0aEZpZW1hcChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwgdWludDMyX3QgZXh0ZW50X2NvdW50KTsKK3N0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiBQYXRoRmllbWFwKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50MzJfdCBleHRlbnRfY291bnQpOwogCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL0lkbGVNYWludC5jcHAgYi9JZGxlTWFpbnQuY3BwCmluZGV4IGM1YmFhOWUuLjc5ODk0ZmMgMTAwNjQ0Ci0tLSBhL0lkbGVNYWludC5jcHAKKysrIGIvSWRsZU1haW50LmNwcApAQCAtMzMsMTEgKzMzLDExIEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKICNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZTsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmc7CkBAIC04MCw4ICs4MCw3IEBACiBzdGF0aWMgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY3ZfYWJvcnQsIGN2X3N0b3A7CiBzdGF0aWMgc3RkOjptdXRleCBjdl9tOwogCi1zdGF0aWMgdm9pZCBhZGRGcm9tVm9sdW1lTWFuYWdlcihzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+KiBwYXRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhUeXBlcyBwYXRoX3R5cGUpIHsKK3N0YXRpYyB2b2lkIGFkZEZyb21Wb2x1bWVNYW5hZ2VyKHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4qIHBhdGhzLCBQYXRoVHlwZXMgcGF0aF90eXBlKSB7CiAgICAgVm9sdW1lTWFuYWdlciogdm0gPSBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpOwogICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gcHJpdmF0ZUlkczsKICAgICB2bS0+bGlzdFZvbHVtZXMoVm9sdW1lQmFzZTo6VHlwZTo6a1ByaXZhdGUsIHByaXZhdGVJZHMpOwpAQCAtOTUsMTEgKzk0LDkgQEAKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNfdHlwZSA9IHZvbC0+Z2V0RnNUeXBlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGZzX3R5cGUgPT0gImYyZnMiICYmIChSZWFscGF0aCh2b2wtPmdldFJhd0RtRGV2UGF0aCgpLCAmZ2NfcGF0aCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxwYXRoKHZvbC0+Z2V0UmF3RGV2UGF0aCgpLCAmZ2NfcGF0aCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc190eXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKyBCYXNlbmFtZShnY19wYXRoKSk7CisgICAgICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc190eXBlICsgIi8iICsgQmFzZW5hbWUoZ2NfcGF0aCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTA3LDcgKzEwNCw3IEBACiBzdGF0aWMgdm9pZCBhZGRGcm9tRnN0YWIoc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiogcGF0aHMsIFBhdGhUeXBlcyBwYXRoX3R5cGUpIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZnN0YWIsIGRlY2x0eXBlKCZmc19tZ3JfZnJlZV9mc3RhYik+IGZzdGFiKGZzX21ncl9yZWFkX2ZzdGFiX2RlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX21ncl9mcmVlX2ZzdGFiKTsKLSAgICBzdHJ1Y3QgZnN0YWJfcmVjICpwcmV2X3JlYyA9IE5VTEw7CisgICAgc3RydWN0IGZzdGFiX3JlYyogcHJldl9yZWMgPSBOVUxMOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmc3RhYi0+bnVtX2VudHJpZXM7IGkrKykgewogICAgICAgICBhdXRvIGZzX3R5cGUgPSBzdGQ6OnN0cmluZyhmc3RhYi0+cmVjc1tpXS5mc190eXBlKTsKQEAgLTEzOCwxMCArMTM1LDExIEBACiAgICAgICAgIH0gZWxzZSBpZiAocGF0aF90eXBlID09IFBhdGhUeXBlczo6a0Jsa0RldmljZSkgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2NfcGF0aDsKICAgICAgICAgICAgIGlmIChzdGQ6OnN0cmluZyhmc3RhYi0+cmVjc1tpXS5mc190eXBlKSA9PSAiZjJmcyIgJiYKLSAgICAgICAgICAgICAgICBSZWFscGF0aChhbmRyb2lkOjp2b2xkOjpCbG9ja0RldmljZUZvclBhdGgoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGZzdGFiLT5yZWNzW2ldLm1vdW50X3BvaW50KSArICIvIiksICZnY19wYXRoKSkgewotICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc3RhYi0+cmVjc1tpXS5mc190eXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiArIEJhc2VuYW1lKGdjX3BhdGgpKTsKKyAgICAgICAgICAgICAgICBSZWFscGF0aCgKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6QmxvY2tEZXZpY2VGb3JQYXRoKHN0ZDo6c3RyaW5nKGZzdGFiLT5yZWNzW2ldLm1vdW50X3BvaW50KSArICIvIiksCisgICAgICAgICAgICAgICAgICAgICZnY19wYXRoKSkgeworICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc3RhYi0+cmVjc1tpXS5mc190eXBlICsgIi8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VuYW1lKGdjX3BhdGgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xODQsOCArMTgyLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5zZWNzX3QgdGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIlRyaW1tZWQgIiA8PCByYW5nZS5sZW4gPDwgIiBieXRlcyBvbiAiIDw8IHBhdGgKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyh0aW1lKSA8PCAibXMiOworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJUcmltbWVkICIgPDwgcmFuZ2UubGVuIDw8ICIgYnl0ZXMgb24gIiA8PCBwYXRoIDw8ICIgaW4gIgorICAgICAgICAgICAgICAgICAgICAgIDw8IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyh0aW1lKSA8PCAibXMiOwogICAgICAgICAgICAgZXh0cmFzLnB1dExvbmcoU3RyaW5nMTYoImJ5dGVzIiksIHJhbmdlLmxlbik7CiAgICAgICAgICAgICBleHRyYXMucHV0TG9uZyhTdHJpbmcxNigidGltZSIpLCB0aW1lKTsKICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgewpAQCAtMjMwLDggKzIyOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBsay5sb2NrKCk7Ci0gICAgICAgIGFib3J0ZWQgPSBjdl9hYm9ydC53YWl0X2ZvcihsaywgMTBzLCBbXXsKLSAgICAgICAgICAgIHJldHVybiBpZGxlX21haW50X3N0YXQgPT0gSWRsZU1haW50U3RhdHM6OmtBYm9ydDt9KTsKKyAgICAgICAgYWJvcnRlZCA9CisgICAgICAgICAgICBjdl9hYm9ydC53YWl0X2ZvcihsaywgMTBzLCBbXSB7IHJldHVybiBpZGxlX21haW50X3N0YXQgPT0gSWRsZU1haW50U3RhdHM6OmtBYm9ydDsgfSk7CiAgICAgICAgIGxrLnVubG9jaygpOwogICAgIH0KIApAQCAtMjY3LDcgKzI2NSw3IEBACiBzdGF0aWMgdm9pZCBydW5EZXZHY0ZzdGFiKHZvaWQpIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZnN0YWIsIGRlY2x0eXBlKCZmc19tZ3JfZnJlZV9mc3RhYik+IGZzdGFiKGZzX21ncl9yZWFkX2ZzdGFiX2RlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX21ncl9mcmVlX2ZzdGFiKTsKLSAgICBzdHJ1Y3QgZnN0YWJfcmVjICpyZWMgPSBOVUxMOworICAgIHN0cnVjdCBmc3RhYl9yZWMqIHJlYyA9IE5VTEw7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZzdGFiLT5udW1fZW50cmllczsgaSsrKSB7CiAgICAgICAgIGlmIChmc19tZ3JfaGFzX3N5c2ZzX3BhdGgoJmZzdGFiLT5yZWNzW2ldKSkgewpAQCAtNDI3LDggKzQyNSw3IEBACiAgICAgICAgIGN2X2Fib3J0Lm5vdGlmeV9vbmUoKTsKICAgICAgICAgbGsubG9jaygpOwogICAgICAgICBMT0coREVCVUcpIDw8ICJhYm9ydGluZyBpZGxlIG1haW50ZW5hbmNlIjsKLSAgICAgICAgY3Zfc3RvcC53YWl0KGxrLCBbXXsKLSAgICAgICAgICAgIHJldHVybiBpZGxlX21haW50X3N0YXQgPT0gSWRsZU1haW50U3RhdHM6OmtTdG9wcGVkO30pOworICAgICAgICBjdl9zdG9wLndhaXQobGssIFtdIHsgcmV0dXJuIGlkbGVfbWFpbnRfc3RhdCA9PSBJZGxlTWFpbnRTdGF0czo6a1N0b3BwZWQ7IH0pOwogICAgIH0KICAgICBsay51bmxvY2soKTsKIApkaWZmIC0tZ2l0IGEvS2V5QnVmZmVyLmNwcCBiL0tleUJ1ZmZlci5jcHAKaW5kZXggZTdhZWRlNS4uNTYzM2JmOCAxMDA2NDQKLS0tIGEvS2V5QnVmZmVyLmNwcAorKysgYi9LZXlCdWZmZXIuY3BwCkBAIC0zNCw0ICszNCwzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSB2b2xkCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9LZXlCdWZmZXIuaCBiL0tleUJ1ZmZlci5oCmluZGV4IDIwODcxODcuLmE2ODMxMWYgMTAwNjQ0Ci0tLSBhL0tleUJ1ZmZlci5oCisrKyBiL0tleUJ1ZmZlci5oCkBAIC0zMywxNyArMzMsMTUgQEAKICNkZWZpbmUgT1BUTk9ORSBfX2F0dHJpYnV0ZV9fKChvcHRpbWl6ZSgiTzAiKSkpCiAjZW5kaWYgIC8vIG5vdCBfX2NsYW5nX18KIGlubGluZSBPUFROT05FIHZvaWQqIG1lbXNldF9zKHZvaWQqIHMsIGludCBjLCBzaXplX3QgbikgewotICAgIGlmICghcykKLSAgICAgICAgcmV0dXJuIHM7CisgICAgaWYgKCFzKSByZXR1cm4gczsKICAgICByZXR1cm4gbWVtc2V0KHMsIGMsIG4pOwogfQogI3VuZGVmIE9QVE5PTkUKIAogLy8gQWxsb2NhdG9yIHRoYXQgZGVsZWdhdGVzIHVzZWZ1bCB3b3JrIHRvIHN0YW5kYXJkIG9uZSBidXQgemVyb2VzIGRhdGEgYmVmb3JlIGRlYWxsb2NhdGluZy4KIGNsYXNzIFplcm9pbmdBbGxvY2F0b3IgOiBwdWJsaWMgc3RkOjphbGxvY2F0b3I8Y2hhcj4gewotICAgIHB1YmxpYzoKLSAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBwLCBzaXplX3R5cGUgbikKLSAgICB7CisgIHB1YmxpYzoKKyAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBwLCBzaXplX3R5cGUgbikgewogICAgICAgICBtZW1zZXRfcyhwLCAwLCBuKTsKICAgICAgICAgc3RkOjphbGxvY2F0b3I8Y2hhcj46OmRlYWxsb2NhdGUocCwgbik7CiAgICAgfQpAQCAtNjAsNCArNTgsMyBAQAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL0tleVN0b3JhZ2UuY3BwIGIvS2V5U3RvcmFnZS5jcHAKaW5kZXggMDUxODkzMC4uMDM1YzdiNyAxMDA2NDQKLS0tIGEvS2V5U3RvcmFnZS5jcHAKKysrIGIvS2V5U3RvcmFnZS5jcHAKQEAgLTU2OCw3ICs1NjgsMTAgQEAKICAgICAgICAgc3VjY2VzcyAmPSBkZWxldGVLZXkoZGlyKTsKICAgICB9CiAgICAgYXV0byBzZWNkaXNjYXJkX2NtZCA9IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsKLSAgICAgICAga1NlY2Rpc2NhcmRQYXRoLCAiLS0iLCBkaXIgKyAiLyIgKyBrRm5fZW5jcnlwdGVkX2tleSwgZGlyICsgIi8iICsga0ZuX3NlY2Rpc2NhcmRhYmxlLAorICAgICAgICBrU2VjZGlzY2FyZFBhdGgsCisgICAgICAgICItLSIsCisgICAgICAgIGRpciArICIvIiArIGtGbl9lbmNyeXB0ZWRfa2V5LAorICAgICAgICBkaXIgKyAiLyIgKyBrRm5fc2VjZGlzY2FyZGFibGUsCiAgICAgfTsKICAgICBpZiAodXNlc19rbSkgewogICAgICAgICBzZWNkaXNjYXJkX2NtZC5lbXBsYWNlX2JhY2soZGlyICsgIi8iICsga0ZuX2tleW1hc3Rlcl9rZXlfYmxvYik7CmRpZmYgLS1naXQgYS9LZXlVdGlsLmNwcCBiL0tleVV0aWwuY3BwCmluZGV4IDk4ODU0NDAuLjI5YmE2OTkgMTAwNjQ0Ci0tLSBhL0tleVV0aWwuY3BwCisrKyBiL0tleVV0aWwuY3BwCkBAIC04OCwxMiArODgsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgY2hhciBjb25zdCogY29uc3QgTkFNRV9QUkVGSVhFU1tdID0gewotICAgICJleHQ0IiwKLSAgICAiZjJmcyIsCi0gICAgImZzY3J5cHQiLAotICAgIG51bGxwdHIKLX07CitzdGF0aWMgY2hhciBjb25zdCogY29uc3QgTkFNRV9QUkVGSVhFU1tdID0geyJleHQ0IiwgImYyZnMiLCAiZnNjcnlwdCIsIG51bGxwdHJ9OwogCiBzdGF0aWMgc3RkOjpzdHJpbmcga2V5bmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3JlZikgewogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOwpAQCAtMTE5LDcgKzExNCw3IEBACiBib29sIGluc3RhbGxLZXkoY29uc3QgS2V5QnVmZmVyJiBrZXksIHN0ZDo6c3RyaW5nKiByYXdfcmVmKSB7CiAgICAgLy8gUGxhY2UgZXh0NF9lbmNyeXB0aW9uX2tleSBpbnRvIGF1dG9tYXRpY2FsbHkgemVyb2luZyBidWZmZXIuCiAgICAgS2V5QnVmZmVyIGV4dDRLZXlCdWZmZXIoc2l6ZW9mKGV4dDRfZW5jcnlwdGlvbl9rZXkpKTsKLSAgICBleHQ0X2VuY3J5cHRpb25fa2V5ICZleHQ0X2tleSA9ICpyZWludGVycHJldF9jYXN0PGV4dDRfZW5jcnlwdGlvbl9rZXkqPihleHQ0S2V5QnVmZmVyLmRhdGEoKSk7CisgICAgZXh0NF9lbmNyeXB0aW9uX2tleSYgZXh0NF9rZXkgPSAqcmVpbnRlcnByZXRfY2FzdDxleHQ0X2VuY3J5cHRpb25fa2V5Kj4oZXh0NEtleUJ1ZmZlci5kYXRhKCkpOwogCiAgICAgaWYgKCFmaWxsS2V5KGtleSwgJmV4dDRfa2V5KSkgcmV0dXJuIGZhbHNlOwogICAgICpyYXdfcmVmID0gZ2VuZXJhdGVLZXlSZWYoZXh0NF9rZXkucmF3LCBleHQ0X2tleS5zaXplKTsKQEAgLTE3MCw4ICsxNjUsOCBAQAogICAgICAgICBpZiAoIXJldHJpZXZlS2V5KGtleV9wYXRoLCBrZXlfYXV0aGVudGljYXRpb24sICZrZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFjcmVhdGVfaWZfYWJzZW50KSB7Ci0gICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGtleSBmb3VuZCBpbiAiIDw8IGtleV9wYXRoOwotICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBrZXkgZm91bmQgaW4gIiA8PCBrZXlfcGF0aDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIG5ldyBrZXkgaW4gIiA8PCBrZXlfcGF0aDsKICAgICAgICAgaWYgKCFyYW5kb21LZXkoJmtleSkpIHJldHVybiBmYWxzZTsKQEAgLTE4NSwyMCArMTgwLDE5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgcmV0cmlldmVLZXkoYm9vbCBjcmVhdGVfaWZfYWJzZW50LCBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3BhdGgsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0bXBfcGF0aCwgS2V5QnVmZmVyKiBrZXkpIHsKK2Jvb2wgcmV0cmlldmVLZXkoYm9vbCBjcmVhdGVfaWZfYWJzZW50LCBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0bXBfcGF0aCwKKyAgICAgICAgICAgICAgICAgS2V5QnVmZmVyKiBrZXkpIHsKICAgICBpZiAocGF0aEV4aXN0cyhrZXlfcGF0aCkpIHsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiS2V5IGV4aXN0cywgdXNpbmc6ICIgPDwga2V5X3BhdGg7CiAgICAgICAgIGlmICghcmV0cmlldmVLZXkoa2V5X3BhdGgsIGtFbXB0eUF1dGhlbnRpY2F0aW9uLCBrZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFjcmVhdGVfaWZfYWJzZW50KSB7Ci0gICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGtleSBmb3VuZCBpbiAiIDw8IGtleV9wYXRoOwotICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBrZXkgZm91bmQgaW4gIiA8PCBrZXlfcGF0aDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIG5ldyBrZXkgaW4gIiA8PCBrZXlfcGF0aDsKICAgICAgICAgaWYgKCFyYW5kb21LZXkoa2V5KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIXN0b3JlS2V5QXRvbWljYWxseShrZXlfcGF0aCwgdG1wX3BhdGgsCi0gICAgICAgICAgICAgICAga0VtcHR5QXV0aGVudGljYXRpb24sICprZXkpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghc3RvcmVLZXlBdG9taWNhbGx5KGtleV9wYXRoLCB0bXBfcGF0aCwga0VtcHR5QXV0aGVudGljYXRpb24sICprZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvS2V5VXRpbC5oIGIvS2V5VXRpbC5oCmluZGV4IGE4NWVjYTEuLmI0MTE1ZjQgMTAwNjQ0Ci0tLSBhL0tleVV0aWwuaAorKysgYi9LZXlVdGlsLmgKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlICJLZXlCdWZmZXIuaCIKICNpbmNsdWRlICJLZXlTdG9yYWdlLmgiCiAKLSNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewpAQCAtMzIsOCArMzIsOCBAQAogYm9vbCByZXRyaWV2ZUFuZEluc3RhbGxLZXkoYm9vbCBjcmVhdGVfaWZfYWJzZW50LCBjb25zdCBLZXlBdXRoZW50aWNhdGlvbiYga2V5X2F1dGhlbnRpY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9wYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgdG1wX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyoga2V5X3JlZik7Ci1ib29sIHJldHJpZXZlS2V5KGJvb2wgY3JlYXRlX2lmX2Fic2VudCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9wYXRoLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG1wX3BhdGgsIEtleUJ1ZmZlcioga2V5KTsKK2Jvb2wgcmV0cmlldmVLZXkoYm9vbCBjcmVhdGVfaWZfYWJzZW50LCBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0bXBfcGF0aCwKKyAgICAgICAgICAgICAgICAgS2V5QnVmZmVyKiBrZXkpOwogCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL0xvb3AuY3BwIGIvTG9vcC5jcHAKaW5kZXggMzM1Y2ExMy4uOTJmMWU5NyAxMDA2NDQKLS0tIGEvTG9vcC5jcHAKKysrIGIvTG9vcC5jcHAKQEAgLTE2LDI0ICsxNiwyNCBAQAogCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19QQUNLQUdFX01BTkFHRVIKIAorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPHN5cy9tb3VudC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCkBAIC03OSw3ICs3OSw3IEBACiAKICAgICBzdHJ1Y3QgbG9vcF9pbmZvNjQgbGk7CiAgICAgbWVtc2V0KCZsaSwgMCwgc2l6ZW9mKGxpKSk7Ci0gICAgc3RybGNweSgoY2hhciopIGxpLmxvX2NyeXB0X25hbWUsIGtWb2xkUHJlZml4LCBMT19OQU1FX1NJWkUpOworICAgIHN0cmxjcHkoKGNoYXIqKWxpLmxvX2NyeXB0X25hbWUsIGtWb2xkUHJlZml4LCBMT19OQU1FX1NJWkUpOwogICAgIGlmIChpb2N0bChkZXZpY2VfZmQuZ2V0KCksIExPT1BfU0VUX1NUQVRVUzY0LCAmbGkpID09IC0xKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gTE9PUF9TRVRfU1RBVFVTNjQiOwogICAgICAgICByZXR1cm4gLWVycm5vOwpAQCAtODgsNyArODgsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgTG9vcDo6ZGVzdHJveUJ5RGV2aWNlKGNvbnN0IGNoYXIgKmxvb3BEZXZpY2UpIHsKK2ludCBMb29wOjpkZXN0cm95QnlEZXZpY2UoY29uc3QgY2hhciogbG9vcERldmljZSkgewogICAgIGludCBkZXZpY2VfZmQ7CiAKICAgICBkZXZpY2VfZmQgPSBvcGVuKGxvb3BEZXZpY2UsIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBhdXRvIGlkID0gc3RkOjpzdHJpbmcoKGNoYXIqKSBsaS5sb19jcnlwdF9uYW1lKTsKKyAgICAgICAgYXV0byBpZCA9IHN0ZDo6c3RyaW5nKChjaGFyKilsaS5sb19jcnlwdF9uYW1lKTsKICAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoaWQsIGtWb2xkUHJlZml4KSkgewogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiVGVhcmluZyBkb3duIHN0YWxlIGxvb3AgZGV2aWNlIGF0ICIgPDwgcGF0aCA8PCAiIG5hbWVkICIgPDwgaWQ7CiAKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgTG9vcDo6Y3JlYXRlSW1hZ2VGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycykgeworaW50IExvb3A6OmNyZWF0ZUltYWdlRmlsZShjb25zdCBjaGFyKiBmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpIHsKICAgICB1bmlxdWVfZmQgZmQob3BlbihmaWxlLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjAwKSk7CiAgICAgaWYgKGZkLmdldCgpID09IC0xKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGltYWdlICIgPDwgZmlsZTsKQEAgLTE2OSw3ICsxNjksNyBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgTG9vcDo6cmVzaXplSW1hZ2VGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycykgeworaW50IExvb3A6OnJlc2l6ZUltYWdlRmlsZShjb25zdCBjaGFyKiBmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpIHsKICAgICBpbnQgZmQ7CiAKICAgICBpZiAoKGZkID0gb3BlbihmaWxlLCBPX1JEV1IgfCBPX0NMT0VYRUMpKSA8IDApIHsKZGlmZiAtLWdpdCBhL0xvb3AuaCBiL0xvb3AuaAppbmRleCAxMzBjNWI2Li40ZTVmOWMxIDEwMDY0NAotLS0gYS9Mb29wLmgKKysrIGIvTG9vcC5oCkBAIC0xNywxOSArMTcsMjAgQEAKICNpZm5kZWYgX0xPT1BfSAogI2RlZmluZSBfTE9PUF9ICiAKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9vcC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZz4KIAogY2xhc3MgTG9vcCB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBzdGF0aWMgY29uc3QgaW50IExPT1BfTUFYID0gNDA5NjsKLXB1YmxpYzoKKworICBwdWJsaWM6CiAgICAgc3RhdGljIGludCBjcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUsIHN0ZDo6c3RyaW5nJiBvdXRfZGV2aWNlKTsKLSAgICBzdGF0aWMgaW50IGRlc3Ryb3lCeURldmljZShjb25zdCBjaGFyICpsb29wRGV2aWNlKTsKKyAgICBzdGF0aWMgaW50IGRlc3Ryb3lCeURldmljZShjb25zdCBjaGFyKiBsb29wRGV2aWNlKTsKICAgICBzdGF0aWMgaW50IGRlc3Ryb3lBbGwoKTsKLSAgICBzdGF0aWMgaW50IGNyZWF0ZUltYWdlRmlsZShjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpOwotICAgIHN0YXRpYyBpbnQgcmVzaXplSW1hZ2VGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycyk7CisgICAgc3RhdGljIGludCBjcmVhdGVJbWFnZUZpbGUoY29uc3QgY2hhciogZmlsZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKTsKKyAgICBzdGF0aWMgaW50IHJlc2l6ZUltYWdlRmlsZShjb25zdCBjaGFyKiBmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9NZXRhZGF0YUNyeXB0LmNwcCBiL01ldGFkYXRhQ3J5cHQuY3BwCmluZGV4IGMxNGI5YTIuLjg0MmIxOWIgMTAwNjQ0Ci0tLSBhL01ldGFkYXRhQ3J5cHQuY3BwCisrKyBiL01ldGFkYXRhQ3J5cHQuY3BwCkBAIC0xNCwxMyArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJLZXlCdWZmZXIuaCIKICNpbmNsdWRlICJNZXRhZGF0YUNyeXB0LmgiCisjaW5jbHVkZSAiS2V5QnVmZmVyLmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHRocmVhZD4KICNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KQEAgLTM5LDkgKzM5LDkgQEAKICNpbmNsdWRlICJFbmNyeXB0SW5wbGFjZS5oIgogI2luY2x1ZGUgIktleVN0b3JhZ2UuaCIKICNpbmNsdWRlICJLZXlVdGlsLmgiCi0jaW5jbHVkZSAic2Vjb250ZXh0LmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2xkVXRpbC5oIgorI2luY2x1ZGUgInNlY29udGV4dC5oIgogCiAjZGVmaW5lIERNX0NSWVBUX0JVRl9TSVpFIDQwOTYKICNkZWZpbmUgVEFCTEVfTE9BRF9SRVRSSUVTIDEwCkBAIC05OSw5ICs5OSw5IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGJvb2wgZ2V0X251bWJlcl9vZl9zZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFsX2Jsa2RldiwgdWludDY0X3QgKm5yX3NlYykgewotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBkZXZfZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oCi0gICAgICAgIHJlYWxfYmxrZGV2LmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDLCAwKSkpOworc3RhdGljIGJvb2wgZ2V0X251bWJlcl9vZl9zZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFsX2Jsa2RldiwgdWludDY0X3QqIG5yX3NlYykgeworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBkZXZfZmQoCisgICAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHJlYWxfYmxrZGV2LmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDLCAwKSkpOwogICAgIGlmIChkZXZfZmQgPT0gLTEpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBvcGVuICIgPDwgcmVhbF9ibGtkZXYgPDwgIiB0byBtZWFzdXJlIHNpemUiOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTcsMTUgKzExNywxNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGRtX2lvY3RsKiBkbV9pb2N0bF9pbml0KGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG1fbmFtZSkgeworc3RhdGljIHN0cnVjdCBkbV9pb2N0bCogZG1faW9jdGxfaW5pdChjaGFyKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRtX25hbWUpIHsKICAgICBpZiAoYnVmZmVyX3NpemUgPCBzaXplb2YoZG1faW9jdGwpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgImRtX2lvY3RsIGJ1ZmZlciB0b28gc21hbGwiOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKICAgICBtZW1zZXQoYnVmZmVyLCAwLCBidWZmZXJfc2l6ZSk7Ci0gICAgc3RydWN0IGRtX2lvY3RsKiBpbyA9IChzdHJ1Y3QgZG1faW9jdGwqKSBidWZmZXI7CisgICAgc3RydWN0IGRtX2lvY3RsKiBpbyA9IChzdHJ1Y3QgZG1faW9jdGwqKWJ1ZmZlcjsKICAgICBpby0+ZGF0YV9zaXplID0gYnVmZmVyX3NpemU7CiAgICAgaW8tPmRhdGFfc3RhcnQgPSBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKICAgICBpby0+dmVyc2lvblswXSA9IDQ7CkBAIC0xMzksOCArMTM4LDggQEAKIHN0YXRpYyBib29sIGNyZWF0ZV9jcnlwdG9fYmxrX2Rldihjb25zdCBzdGQ6OnN0cmluZyYgZG1fbmFtZSwgdWludDY0X3QgbnJfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXRfdHlwZSwgY29uc3QgS2V5QnVmZmVyJiBjcnlwdF9wYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGNyeXB0b19ibGtkZXYpIHsKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZG1fZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oCi0gICAgICAgICIvZGV2L2RldmljZS1tYXBwZXIiLCBPX1JEV1IgfCBPX0NMT0VYRUMsIDApKSk7CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGRtX2ZkKAorICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkob3BlbigiL2Rldi9kZXZpY2UtbWFwcGVyIiwgT19SRFdSIHwgT19DTE9FWEVDLCAwKSkpOwogICAgIGlmIChkbV9mZCA9PSAtMSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IG9wZW4gZGV2aWNlLW1hcHBlciI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE1OCwxMyArMTU3LDEzIEBACiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmV0cmlldmUgZG0tY3J5cHQgZGV2aWNlIHN0YXR1cyAiIDw8IGRtX25hbWU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgKmNyeXB0b19ibGtkZXYgPSBzdGQ6OnN0cmluZygpICsgIi9kZXYvYmxvY2svZG0tIiArIHN0ZDo6dG9fc3RyaW5nKAotICAgICAgICAoaW8tPmRldiAmIDB4ZmYpIHwgKChpby0+ZGV2ID4+IDEyKSAmIDB4ZmZmMDApKTsKKyAgICAqY3J5cHRvX2Jsa2RldiA9IHN0ZDo6c3RyaW5nKCkgKyAiL2Rldi9ibG9jay9kbS0iICsKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKChpby0+ZGV2ICYgMHhmZikgfCAoKGlvLT5kZXYgPj4gMTIpICYgMHhmZmYwMCkpOwogCiAgICAgaW8gPSBkbV9pb2N0bF9pbml0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGRtX25hbWUpOwogICAgIHNpemVfdCBwYXJhbWl4ID0gaW8tPmRhdGFfc3RhcnQgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKTsKICAgICBzaXplX3QgbnVsbGl4ID0gcGFyYW1peCArIGNyeXB0X3BhcmFtcy5zaXplKCk7Ci0gICAgc2l6ZV90IGVuZGl4ID0gKG51bGxpeCArIDEgKyA3KSAmIDg7IC8vIEFkZCByb29tIGZvciBcMCBhbmQgYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5CisgICAgc2l6ZV90IGVuZGl4ID0gKG51bGxpeCArIDEgKyA3KSAmIDg7ICAvLyBBZGQgcm9vbSBmb3IgXDAgYW5kIGFsaWduIHRvIDggYnl0ZSBib3VuZGFyeQogCiAgICAgaWYgKGVuZGl4ID4gc2l6ZW9mKGJ1ZmZlcikpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3J5cHRfcGFyYW1zIHRvbyBiaWcgZm9yIERNX0NSWVBUX0JVRl9TSVpFIjsKQEAgLTE3MiwyMSArMTcxLDIxIEBACiAgICAgfQogCiAgICAgaW8tPnRhcmdldF9jb3VudCA9IDE7Ci0gICAgYXV0byB0Z3QgPSAoc3RydWN0IGRtX3RhcmdldF9zcGVjICopIChidWZmZXIgKyBpby0+ZGF0YV9zdGFydCk7CisgICAgYXV0byB0Z3QgPSAoc3RydWN0IGRtX3RhcmdldF9zcGVjKikoYnVmZmVyICsgaW8tPmRhdGFfc3RhcnQpOwogICAgIHRndC0+c3RhdHVzID0gMDsKICAgICB0Z3QtPnNlY3Rvcl9zdGFydCA9IDA7CiAgICAgdGd0LT5sZW5ndGggPSBucl9zZWM7CiAgICAgdGFyZ2V0X3R5cGUuY29weSh0Z3QtPnRhcmdldF90eXBlLCBzaXplb2YodGd0LT50YXJnZXRfdHlwZSkpOwogICAgIG1lbWNweShidWZmZXIgKyBwYXJhbWl4LCBjcnlwdF9wYXJhbXMuZGF0YSgpLAotICAgICAgICAgICAgc3RkOjptaW4oY3J5cHRfcGFyYW1zLnNpemUoKSwgc2l6ZW9mKGJ1ZmZlcikgLSBwYXJhbWl4KSk7CisgICAgICAgICAgIHN0ZDo6bWluKGNyeXB0X3BhcmFtcy5zaXplKCksIHNpemVvZihidWZmZXIpIC0gcGFyYW1peCkpOwogICAgIGJ1ZmZlcltudWxsaXhdID0gJ1wwJzsKICAgICB0Z3QtPm5leHQgPSBlbmRpeDsKIAotICAgIGZvciAoaW50IGkgPSAwOyA7IGkrKykgeworICAgIGZvciAoaW50IGkgPSAwOzsgaSsrKSB7CiAgICAgICAgIGlmIChpb2N0bChkbV9mZC5nZXQoKSwgRE1fVEFCTEVfTE9BRCwgaW8pID09IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpKzEgPj0gVEFCTEVfTE9BRF9SRVRSSUVTKSB7CisgICAgICAgIGlmIChpICsgMSA+PSBUQUJMRV9MT0FEX1JFVFJJRVMpIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJETV9UQUJMRV9MT0FEIGlvY3RsIGZhaWxlZCI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01vdmVTdG9yYWdlLmNwcCBiL01vdmVTdG9yYWdlLmNwcAppbmRleCA0NjI0MDI2Li40NjUzZTAxIDEwMDY0NAotLS0gYS9Nb3ZlU3RvcmFnZS5jcHAKKysrIGIvTW92ZVN0b3JhZ2UuY3BwCkBAIC0yOSw3ICsyOSw4IEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAotI2RlZmluZSBDT05TVFJBSU4oYW1vdW50LCBsb3csIGhpZ2gpICgoYW1vdW50KSA8IChsb3cpID8gKGxvdykgOiAoKGFtb3VudCkgPiAoaGlnaCkgPyAoaGlnaCkgOiAoYW1vdW50KSkpCisjZGVmaW5lIENPTlNUUkFJTihhbW91bnQsIGxvdywgaGlnaCkgXAorICAgICgoYW1vdW50KSA8IChsb3cpID8gKGxvdykgOiAoKGFtb3VudCkgPiAoaGlnaCkgPyAoaGlnaCkgOiAoYW1vdW50KSkpCiAKIHN0YXRpYyBjb25zdCBjaGFyKiBrUHJvcEJsb2NraW5nRXhlYyA9ICJwZXJzaXN0LnN5cy5ibG9ja2luZ19leGVjIjsKIApAQCAtNDgsNyArNDksNyBAQAogc3RhdGljIGNvbnN0IGNoYXIqIGtXYWtlTG9jayA9ICJNb3ZlVGFzayI7CiAKIHN0YXRpYyB2b2lkIG5vdGlmeVByb2dyZXNzKGludCBwcm9ncmVzcywKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIGFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZSBleHRyYXM7CiAgICAgICAgIGxpc3RlbmVyLT5vblN0YXR1cyhwcm9ncmVzcywgZXh0cmFzKTsKQEAgLTU2LDcgKzU3LDcgQEAKIH0KIAogc3RhdGljIHN0YXR1c190IHB1c2hCYWNrQ29udGVudHMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY21kLAotICAgICAgICBib29sIGFkZFdpbGRjYXJkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZFdpbGRjYXJkKSB7CiAgICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGguY19zdHIoKSk7CiAgICAgaWYgKGRpciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTc5LDcgKzgwLDcgQEAKIH0KIAogc3RhdGljIHN0YXR1c190IGV4ZWNSbShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgaW50IHN0YXJ0UHJvZ3Jlc3MsIGludCBzdGVwUHJvZ3Jlc3MsCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgbm90aWZ5UHJvZ3Jlc3Moc3RhcnRQcm9ncmVzcywgbGlzdGVuZXIpOwogCiAgICAgdWludDY0X3QgZXhwZWN0ZWRCeXRlcyA9IEdldFRyZWVCeXRlcyhwYXRoKTsKQEAgLTExNCwxNCArMTE1LDE3IEBACiAKICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgIHVpbnQ2NF90IGRlbHRhRnJlZUJ5dGVzID0gR2V0RnJlZUJ5dGVzKHBhdGgpIC0gc3RhcnRGcmVlQnl0ZXM7Ci0gICAgICAgIG5vdGlmeVByb2dyZXNzKHN0YXJ0UHJvZ3Jlc3MgKyBDT05TVFJBSU4oKGludCkKLSAgICAgICAgICAgICAgICAoKGRlbHRhRnJlZUJ5dGVzICogc3RlcFByb2dyZXNzKSAvIGV4cGVjdGVkQnl0ZXMpLCAwLCBzdGVwUHJvZ3Jlc3MpLCBsaXN0ZW5lcik7CisgICAgICAgIG5vdGlmeVByb2dyZXNzKAorICAgICAgICAgICAgc3RhcnRQcm9ncmVzcyArCisgICAgICAgICAgICAgICAgQ09OU1RSQUlOKChpbnQpKChkZWx0YUZyZWVCeXRlcyAqIHN0ZXBQcm9ncmVzcykgLyBleHBlY3RlZEJ5dGVzKSwgMCwgc3RlcFByb2dyZXNzKSwKKyAgICAgICAgICAgIGxpc3RlbmVyKTsKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgc3RhdHVzX3QgZXhlY0NwKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRvUGF0aCwgaW50IHN0YXJ0UHJvZ3Jlc3MsCi0gICAgICAgIGludCBzdGVwUHJvZ3Jlc3MsIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwUHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgbm90aWZ5UHJvZ3Jlc3Moc3RhcnRQcm9ncmVzcywgbGlzdGVuZXIpOwogCiAgICAgdWludDY0X3QgZXhwZWN0ZWRCeXRlcyA9IEdldFRyZWVCeXRlcyhmcm9tUGF0aCk7CkBAIC0xMjksNyArMTMzLDcgQEAKIAogICAgIGlmIChleHBlY3RlZEJ5dGVzID4gc3RhcnRGcmVlQnl0ZXMpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGF0YSBzaXplICIgPDwgZXhwZWN0ZWRCeXRlcyA8PCAiIGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gZnJlZSBzcGFjZSAiCi0gICAgICAgICAgICAgICAgPDwgc3RhcnRGcmVlQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgPDwgc3RhcnRGcmVlQnl0ZXM7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKQEAgLTE2NSw4ICsxNjksMTAgQEAKIAogICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgdWludDY0X3QgZGVsdGFGcmVlQnl0ZXMgPSBzdGFydEZyZWVCeXRlcyAtIEdldEZyZWVCeXRlcyh0b1BhdGgpOwotICAgICAgICBub3RpZnlQcm9ncmVzcyhzdGFydFByb2dyZXNzICsgQ09OU1RSQUlOKChpbnQpCi0gICAgICAgICAgICAgICAgKChkZWx0YUZyZWVCeXRlcyAqIHN0ZXBQcm9ncmVzcykgLyBleHBlY3RlZEJ5dGVzKSwgMCwgc3RlcFByb2dyZXNzKSwgbGlzdGVuZXIpOworICAgICAgICBub3RpZnlQcm9ncmVzcygKKyAgICAgICAgICAgIHN0YXJ0UHJvZ3Jlc3MgKworICAgICAgICAgICAgICAgIENPTlNUUkFJTigoaW50KSgoZGVsdGFGcmVlQnl0ZXMgKiBzdGVwUHJvZ3Jlc3MpIC8gZXhwZWN0ZWRCeXRlcyksIDAsIHN0ZXBQcm9ncmVzcyksCisgICAgICAgICAgICBsaXN0ZW5lcik7CiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KQEAgLTE4Niw4ICsxOTIsOCBAQAogfQogCiBzdGF0aWMgc3RhdHVzX3QgbW92ZVN0b3JhZ2VJbnRlcm5hbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIGZyb20sCi0gICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPiYgdG8sCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBzdGQ6OnN0cmluZyBmcm9tUGF0aDsKICAgICBzdGQ6OnN0cmluZyB0b1BhdGg7CiAKQEAgLTIzOSwxNyArMjQ1LDE5IEBACiAgICAgLy8gdXNlZnVsIGFueXdheS4KICAgICBleGVjUm0odG9QYXRoLCA4MCwgMSwgbGlzdGVuZXIpOwogZmFpbDoKKyAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5nZXRMb2NrKCkpOwogICAgICAgICBicmluZ09ubGluZShmcm9tKTsKICAgICAgICAgYnJpbmdPbmxpbmUodG8pOwogICAgIH0KKyAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICBub3RpZnlQcm9ncmVzcyhrTW92ZUZhaWxlZEludGVybmFsRXJyb3IsIGxpc3RlbmVyKTsKICAgICByZXR1cm4gLTE7CiB9CiAKIHZvaWQgTW92ZVN0b3JhZ2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+JiBmcm9tLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIHRvLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIGFjcXVpcmVfd2FrZV9sb2NrKFBBUlRJQUxfV0FLRV9MT0NLLCBrV2FrZUxvY2spOwogCiAgICAgYW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlIGV4dHJhczsKZGlmZiAtLWdpdCBhL01vdmVTdG9yYWdlLmggYi9Nb3ZlU3RvcmFnZS5oCmluZGV4IGQyNzE3MDQuLjQ2Zjc0NWYgMTAwNjQ0Ci0tLSBhL01vdmVTdG9yYWdlLmgKKysrIGIvTW92ZVN0b3JhZ2UuaApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIHZvbGQgewogCiB2b2lkIE1vdmVTdG9yYWdlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPiYgZnJvbSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+JiB0bywKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAKIH0gIC8vIG5hbWVzcGFjZSB2b2xkCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvTmV0bGlua0hhbmRsZXIuY3BwIGIvTmV0bGlua0hhbmRsZXIuY3BwCmluZGV4IDkyMTMxZTkuLmQxODBhOTUgMTAwNjQ0Ci0tLSBhL05ldGxpbmtIYW5kbGVyLmNwcAorKysgYi9OZXRsaW5rSGFuZGxlci5jcHAKQEAgLTE0LDkgKzE0LDkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CkBAIC0yNSwxMiArMjUsOSBAQAogI2luY2x1ZGUgIk5ldGxpbmtIYW5kbGVyLmgiCiAjaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgogCi1OZXRsaW5rSGFuZGxlcjo6TmV0bGlua0hhbmRsZXIoaW50IGxpc3RlbmVyU29ja2V0KSA6Ci0gICAgICAgICAgICAgICAgTmV0bGlua0xpc3RlbmVyKGxpc3RlbmVyU29ja2V0KSB7Ci19CitOZXRsaW5rSGFuZGxlcjo6TmV0bGlua0hhbmRsZXIoaW50IGxpc3RlbmVyU29ja2V0KSA6IE5ldGxpbmtMaXN0ZW5lcihsaXN0ZW5lclNvY2tldCkge30KIAotTmV0bGlua0hhbmRsZXI6On5OZXRsaW5rSGFuZGxlcigpIHsKLX0KK05ldGxpbmtIYW5kbGVyOjp+TmV0bGlua0hhbmRsZXIoKSB7fQogCiBpbnQgTmV0bGlua0hhbmRsZXI6OnN0YXJ0KCkgewogICAgIHJldHVybiB0aGlzLT5zdGFydExpc3RlbmVyKCk7CkBAIC00MCw5ICszNyw5IEBACiAgICAgcmV0dXJuIHRoaXMtPnN0b3BMaXN0ZW5lcigpOwogfQogCi12b2lkIE5ldGxpbmtIYW5kbGVyOjpvbkV2ZW50KE5ldGxpbmtFdmVudCAqZXZ0KSB7Ci0gICAgVm9sdW1lTWFuYWdlciAqdm0gPSBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpOwotICAgIGNvbnN0IGNoYXIgKnN1YnN5cyA9IGV2dC0+Z2V0U3Vic3lzdGVtKCk7Cit2b2lkIE5ldGxpbmtIYW5kbGVyOjpvbkV2ZW50KE5ldGxpbmtFdmVudCogZXZ0KSB7CisgICAgVm9sdW1lTWFuYWdlciogdm0gPSBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpOworICAgIGNvbnN0IGNoYXIqIHN1YnN5cyA9IGV2dC0+Z2V0U3Vic3lzdGVtKCk7CiAKICAgICBpZiAoIXN1YnN5cykgewogICAgICAgICBMT0coV0FSTklORykgPDwgIk5vIHN1YnN5c3RlbSBmb3VuZCBpbiBuZXRsaW5rIGV2ZW50IjsKZGlmZiAtLWdpdCBhL05ldGxpbmtIYW5kbGVyLmggYi9OZXRsaW5rSGFuZGxlci5oCmluZGV4IDU2ZWIyM2MuLjhhZjc1NzUgMTAwNjQ0Ci0tLSBhL05ldGxpbmtIYW5kbGVyLmgKKysrIGIvTmV0bGlua0hhbmRsZXIuaApAQCAtMTksMTYgKzE5LDE1IEBACiAKICNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rTGlzdGVuZXIuaD4KIAotY2xhc3MgTmV0bGlua0hhbmRsZXI6IHB1YmxpYyBOZXRsaW5rTGlzdGVuZXIgewotCi1wdWJsaWM6CitjbGFzcyBOZXRsaW5rSGFuZGxlciA6IHB1YmxpYyBOZXRsaW5rTGlzdGVuZXIgeworICBwdWJsaWM6CiAgICAgZXhwbGljaXQgTmV0bGlua0hhbmRsZXIoaW50IGxpc3RlbmVyU29ja2V0KTsKICAgICB2aXJ0dWFsIH5OZXRsaW5rSGFuZGxlcigpOwogCiAgICAgaW50IHN0YXJ0KHZvaWQpOwogICAgIGludCBzdG9wKHZvaWQpOwogCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoTmV0bGlua0V2ZW50ICpldnQpOworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoTmV0bGlua0V2ZW50KiBldnQpOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTmV0bGlua01hbmFnZXIuY3BwIGIvTmV0bGlua01hbmFnZXIuY3BwCmluZGV4IDQwOWNkYzguLmFhY2Y0YjkgMTAwNjQ0Ci0tLSBhL05ldGxpbmtNYW5hZ2VyLmNwcAorKysgYi9OZXRsaW5rTWFuYWdlci5jcHAKQEAgLTE0LDEyICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvdW4uaD4KQEAgLTI4LDE0ICsyOCwxMyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KIAotI2luY2x1ZGUgIk5ldGxpbmtNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiTmV0bGlua0hhbmRsZXIuaCIKKyNpbmNsdWRlICJOZXRsaW5rTWFuYWdlci5oIgogCi1OZXRsaW5rTWFuYWdlciAqTmV0bGlua01hbmFnZXI6OnNJbnN0YW5jZSA9IE5VTEw7CitOZXRsaW5rTWFuYWdlciogTmV0bGlua01hbmFnZXI6OnNJbnN0YW5jZSA9IE5VTEw7CiAKLU5ldGxpbmtNYW5hZ2VyICpOZXRsaW5rTWFuYWdlcjo6SW5zdGFuY2UoKSB7Ci0gICAgaWYgKCFzSW5zdGFuY2UpCi0gICAgICAgIHNJbnN0YW5jZSA9IG5ldyBOZXRsaW5rTWFuYWdlcigpOworTmV0bGlua01hbmFnZXIqIE5ldGxpbmtNYW5hZ2VyOjpJbnN0YW5jZSgpIHsKKyAgICBpZiAoIXNJbnN0YW5jZSkgc0luc3RhbmNlID0gbmV3IE5ldGxpbmtNYW5hZ2VyKCk7CiAgICAgcmV0dXJuIHNJbnN0YW5jZTsKIH0KIApAQCAtNDMsOCArNDIsNyBAQAogICAgIG1Ccm9hZGNhc3RlciA9IE5VTEw7CiB9CiAKLU5ldGxpbmtNYW5hZ2VyOjp+TmV0bGlua01hbmFnZXIoKSB7Ci19CitOZXRsaW5rTWFuYWdlcjo6fk5ldGxpbmtNYW5hZ2VyKCkge30KIAogaW50IE5ldGxpbmtNYW5hZ2VyOjpzdGFydCgpIHsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOwpAQCAtNTYsOCArNTQsNyBAQAogICAgIG5sYWRkci5ubF9waWQgPSBnZXRwaWQoKTsKICAgICBubGFkZHIubmxfZ3JvdXBzID0gMHhmZmZmZmZmZjsKIAotICAgIGlmICgobVNvY2sgPSBzb2NrZXQoUEZfTkVUTElOSywgU09DS19ER1JBTSB8IFNPQ0tfQ0xPRVhFQywKLSAgICAgICAgICAgIE5FVExJTktfS09CSkVDVF9VRVZFTlQpKSA8IDApIHsKKyAgICBpZiAoKG1Tb2NrID0gc29ja2V0KFBGX05FVExJTkssIFNPQ0tfREdSQU0gfCBTT0NLX0NMT0VYRUMsIE5FVExJTktfS09CSkVDVF9VRVZFTlQpKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBjcmVhdGUgdWV2ZW50IHNvY2tldCI7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC03Niw3ICs3Myw3IEBACiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAotICAgIGlmIChiaW5kKG1Tb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZubGFkZHIsIHNpemVvZihubGFkZHIpKSA8IDApIHsKKyAgICBpZiAoYmluZChtU29jaywgKHN0cnVjdCBzb2NrYWRkciopJm5sYWRkciwgc2l6ZW9mKG5sYWRkcikpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGJpbmQgdWV2ZW50IHNvY2tldCI7CiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KZGlmZiAtLWdpdCBhL05ldGxpbmtNYW5hZ2VyLmggYi9OZXRsaW5rTWFuYWdlci5oCmluZGV4IDljN2JhMTEuLmUzMWZjMmUgMTAwNjQ0Ci0tLSBhL05ldGxpbmtNYW5hZ2VyLmgKKysrIGIvTmV0bGlua01hbmFnZXIuaApAQCAtMTcsMzIgKzE3LDMyIEBACiAjaWZuZGVmIF9ORVRMSU5LTUFOQUdFUl9ICiAjZGVmaW5lIF9ORVRMSU5LTUFOQUdFUl9ICiAKLSNpbmNsdWRlIDxzeXN1dGlscy9Tb2NrZXRMaXN0ZW5lci5oPgogI2luY2x1ZGUgPHN5c3V0aWxzL05ldGxpbmtMaXN0ZW5lci5oPgorI2luY2x1ZGUgPHN5c3V0aWxzL1NvY2tldExpc3RlbmVyLmg+CiAKIGNsYXNzIE5ldGxpbmtIYW5kbGVyOwogCiBjbGFzcyBOZXRsaW5rTWFuYWdlciB7Ci1wcml2YXRlOgotICAgIHN0YXRpYyBOZXRsaW5rTWFuYWdlciAqc0luc3RhbmNlOworICBwcml2YXRlOgorICAgIHN0YXRpYyBOZXRsaW5rTWFuYWdlciogc0luc3RhbmNlOwogCi1wcml2YXRlOgotICAgIFNvY2tldExpc3RlbmVyICAgICAgICptQnJvYWRjYXN0ZXI7Ci0gICAgTmV0bGlua0hhbmRsZXIgICAgICAgKm1IYW5kbGVyOwotICAgIGludCAgICAgICAgICAgICAgICAgIG1Tb2NrOworICBwcml2YXRlOgorICAgIFNvY2tldExpc3RlbmVyKiBtQnJvYWRjYXN0ZXI7CisgICAgTmV0bGlua0hhbmRsZXIqIG1IYW5kbGVyOworICAgIGludCBtU29jazsKIAotcHVibGljOgorICBwdWJsaWM6CiAgICAgdmlydHVhbCB+TmV0bGlua01hbmFnZXIoKTsKIAogICAgIGludCBzdGFydCgpOwogICAgIGludCBzdG9wKCk7CiAKLSAgICB2b2lkIHNldEJyb2FkY2FzdGVyKFNvY2tldExpc3RlbmVyICpzbCkgeyBtQnJvYWRjYXN0ZXIgPSBzbDsgfQotICAgIFNvY2tldExpc3RlbmVyICpnZXRCcm9hZGNhc3RlcigpIHsgcmV0dXJuIG1Ccm9hZGNhc3RlcjsgfQorICAgIHZvaWQgc2V0QnJvYWRjYXN0ZXIoU29ja2V0TGlzdGVuZXIqIHNsKSB7IG1Ccm9hZGNhc3RlciA9IHNsOyB9CisgICAgU29ja2V0TGlzdGVuZXIqIGdldEJyb2FkY2FzdGVyKCkgeyByZXR1cm4gbUJyb2FkY2FzdGVyOyB9CiAKLSAgICBzdGF0aWMgTmV0bGlua01hbmFnZXIgKkluc3RhbmNlKCk7CisgICAgc3RhdGljIE5ldGxpbmtNYW5hZ2VyKiBJbnN0YW5jZSgpOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIE5ldGxpbmtNYW5hZ2VyKCk7CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9Qcm9jZXNzLmNwcCBiL1Byb2Nlc3MuY3BwCmluZGV4IDkwMzhhZjIuLmE1MDI4ZjIgMTAwNjQ0Ci0tLSBhL1Byb2Nlc3MuY3BwCisrKyBiL1Byb2Nlc3MuY3BwCkBAIC0xNCwyOCArMTQsMjggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGZ0cy5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8cHdkLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogCiAjaW5jbHVkZSAiUHJvY2Vzcy5oIgogCmRpZmYgLS1naXQgYS9TY3J5cHRQYXJhbWV0ZXJzLmNwcCBiL1NjcnlwdFBhcmFtZXRlcnMuY3BwCmluZGV4IGMwZTIwMzAuLmY1YTk2NGYgMTAwNjQ0Ci0tLSBhL1NjcnlwdFBhcmFtZXRlcnMuY3BwCisrKyBiL1NjcnlwdFBhcmFtZXRlcnMuY3BwCkBAIC0xOSwyMCArMTksMTkgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotYm9vbCBwYXJzZV9zY3J5cHRfcGFyYW1ldGVycyhjb25zdCBjaGFyKiBwYXJhbXN0ciwgaW50ICpOZiwgaW50ICpyZiwgaW50ICpwZikgeworYm9vbCBwYXJzZV9zY3J5cHRfcGFyYW1ldGVycyhjb25zdCBjaGFyKiBwYXJhbXN0ciwgaW50KiBOZiwgaW50KiByZiwgaW50KiBwZikgewogICAgIGludCBwYXJhbXNbM10gPSB7fTsKLSAgICBjaGFyICp0b2tlbjsKLSAgICBjaGFyICpzYXZlcHRyOworICAgIGNoYXIqIHRva2VuOworICAgIGNoYXIqIHNhdmVwdHI7CiAgICAgaW50IGk7CiAKICAgICAvKgogICAgICAqIFRoZSB0b2tlbiB3ZSdyZSBsb29raW5nIGZvciBzaG91bGQgYmUgdGhyZWUgaW50ZWdlcnMgc2VwYXJhdGVkIGJ5CiAgICAgICogY29sb25zIChlLmcuLCAiMTI6ODoxIikuIFNjYW4gdGhlIHByb3BlcnR5IHRvIG1ha2Ugc3VyZSBpdCBtYXRjaGVzLgogICAgICAqLwotICAgIGZvciAoaSA9IDAsIHRva2VuID0gc3RydG9rX3IoY29uc3RfY2FzdDxjaGFyICo+KHBhcmFtc3RyKSwgIjoiLCAmc2F2ZXB0cik7Ci0gICAgICAgICAgICB0b2tlbiAhPSBudWxscHRyICYmIGkgPCAzOwotICAgICAgICAgICAgaSsrLCB0b2tlbiA9IHN0cnRva19yKG51bGxwdHIsICI6IiwgJnNhdmVwdHIpKSB7Ci0gICAgICAgIGNoYXIgKmVuZHB0cjsKKyAgICBmb3IgKGkgPSAwLCB0b2tlbiA9IHN0cnRva19yKGNvbnN0X2Nhc3Q8Y2hhcio+KHBhcmFtc3RyKSwgIjoiLCAmc2F2ZXB0cik7CisgICAgICAgICB0b2tlbiAhPSBudWxscHRyICYmIGkgPCAzOyBpKyssIHRva2VuID0gc3RydG9rX3IobnVsbHB0ciwgIjoiLCAmc2F2ZXB0cikpIHsKKyAgICAgICAgY2hhciogZW5kcHRyOwogICAgICAgICBwYXJhbXNbaV0gPSBzdHJ0b2wodG9rZW4sICZlbmRwdHIsIDEwKTsKIAogICAgICAgICAvKgpAQCAtNDUsNiArNDQsOCBAQAogICAgIGlmICh0b2tlbiAhPSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgKk5mID0gcGFyYW1zWzBdOyAqcmYgPSBwYXJhbXNbMV07ICpwZiA9IHBhcmFtc1syXTsKKyAgICAqTmYgPSBwYXJhbXNbMF07CisgICAgKnJmID0gcGFyYW1zWzFdOworICAgICpwZiA9IHBhcmFtc1syXTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL1NjcnlwdFBhcmFtZXRlcnMuaCBiL1NjcnlwdFBhcmFtZXRlcnMuaAppbmRleCAxOTA4NDJiLi5lZGI4MGNjIDEwMDY0NAotLS0gYS9TY3J5cHRQYXJhbWV0ZXJzLmgKKysrIGIvU2NyeXB0UGFyYW1ldGVycy5oCkBAIC0yMyw2ICsyMyw2IEBACiAjZGVmaW5lIFNDUllQVF9QUk9QICJyby5jcnlwdG8uc2NyeXB0X3BhcmFtcyIKICNkZWZpbmUgU0NSWVBUX0RFRkFVTFRTICIxNTozOjEiCiAKLWJvb2wgcGFyc2Vfc2NyeXB0X3BhcmFtZXRlcnMoY29uc3QgY2hhciogcGFyYW1zdHIsIGludCAqTmYsIGludCAqcmYsIGludCAqcGYpOworYm9vbCBwYXJzZV9zY3J5cHRfcGFyYW1ldGVycyhjb25zdCBjaGFyKiBwYXJhbXN0ciwgaW50KiBOZiwgaW50KiByZiwgaW50KiBwZik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvVXRpbHMuY3BwIGIvVXRpbHMuY3BwCmluZGV4IDAwMmFmMDMuLmYwODVjMjIgMTAwNjQ0Ci0tLSBhL1V0aWxzLmNwcAorKysgYi9VdGlscy5jcHAKQEAgLTIyLDI2ICsyMiwyNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKLSNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPG11dGV4PgogCiAjaWZuZGVmIFVNT1VOVF9OT0ZPTExPVwotI2RlZmluZSBVTU9VTlRfTk9GT0xMT1cgICAgMHgwMDAwMDAwOCAgLyogRG9uJ3QgZm9sbG93IHN5bWxpbmsgb24gdW1vdW50ICovCisjZGVmaW5lIFVNT1VOVF9OT0ZPTExPVyAweDAwMDAwMDA4IC8qIERvbid0IGZvbGxvdyBzeW1saW5rIG9uIHVtb3VudCAqLwogI2VuZGlmCiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmc7CkBAIC04MSw4ICs4MSw4IEBACiAgICAgbW9kZV90IG1vZGUgPSAwNjYwIHwgU19JRkJMSzsKICAgICBpZiAobWtub2QoY3BhdGgsIG1vZGUsIGRldikgPCAwKSB7CiAgICAgICAgIGlmIChlcnJubyAhPSBFRVhJU1QpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGRldmljZSBub2RlIGZvciAiIDw8IG1ham9yKGRldikKLSAgICAgICAgICAgICAgICAgICAgPDwgIjoiIDw8IG1pbm9yKGRldikgPDwgIiBhdCAiIDw8IHBhdGg7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugbm9kZSBmb3IgIiA8PCBtYWpvcihkZXYpIDw8ICI6IiA8PCBtaW5vcihkZXYpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGF0ICIgPDwgcGF0aDsKICAgICAgICAgICAgIHJlcyA9IC1lcnJubzsKICAgICAgICAgfQogICAgIH0KQEAgLTIwOSw4ICsyMDksOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgcmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLAotICAgICAgICBzdGQ6OnN0cmluZyogZnNVdWlkLCBzdGQ6OnN0cmluZyogZnNMYWJlbCwgYm9vbCB1bnRydXN0ZWQpIHsKK3N0YXRpYyBzdGF0dXNfdCByZWFkTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsIHN0ZDo6c3RyaW5nKiBmc1V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBmc0xhYmVsLCBib29sIHVudHJ1c3RlZCkgewogICAgIGZzVHlwZS0+Y2xlYXIoKTsKICAgICBmc1V1aWQtPmNsZWFyKCk7CiAgICAgZnNMYWJlbC0+Y2xlYXIoKTsKQEAgLTI0NCwxMyArMjQ0LDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBSZWFkTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsCi0gICAgICAgIHN0ZDo6c3RyaW5nKiBmc1V1aWQsIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKSB7CitzdGF0dXNfdCBSZWFkTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsIHN0ZDo6c3RyaW5nKiBmc1V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZzTGFiZWwpIHsKICAgICByZXR1cm4gcmVhZE1ldGFkYXRhKHBhdGgsIGZzVHlwZSwgZnNVdWlkLCBmc0xhYmVsLCBmYWxzZSk7CiB9CiAKLXN0YXR1c190IFJlYWRNZXRhZGF0YVVudHJ1c3RlZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwKLSAgICAgICAgc3RkOjpzdHJpbmcqIGZzVXVpZCwgc3RkOjpzdHJpbmcqIGZzTGFiZWwpIHsKK3N0YXR1c190IFJlYWRNZXRhZGF0YVVudHJ1c3RlZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwgc3RkOjpzdHJpbmcqIGZzVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZnNMYWJlbCkgewogICAgIHJldHVybiByZWFkTWV0YWRhdGEocGF0aCwgZnNUeXBlLCBmc1V1aWQsIGZzTGFiZWwsIHRydWUpOwogfQogCkBAIC0yNjEsOSArMjYxLDkgQEAKIHN0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLCBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGtTZWN1cml0eUxvY2spOwogICAgIHNpemVfdCBhcmdjID0gYXJncy5zaXplKCk7Ci0gICAgY2hhcioqIGFyZ3YgPSAoY2hhcioqKSBjYWxsb2MoYXJnYywgc2l6ZW9mKGNoYXIqKSk7CisgICAgY2hhcioqIGFyZ3YgPSAoY2hhcioqKWNhbGxvYyhhcmdjLCBzaXplb2YoY2hhciopKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBhcmd2W2ldID0gKGNoYXIqKSBhcmdzW2ldLmNfc3RyKCk7CisgICAgICAgIGFyZ3ZbaV0gPSAoY2hhciopYXJnc1tpXS5jX3N0cigpOwogICAgICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgYXJnc1tpXTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTI4OSwxMyArMjg5LDEyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgb3V0cHV0KSB7CitzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQpIHsKICAgICByZXR1cm4gRm9ya0V4ZWN2cChhcmdzLCBvdXRwdXQsIG51bGxwdHIpOwogfQogCi1zdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQsIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KSB7CitzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soa1NlY3VyaXR5TG9jayk7CiAgICAgc3RkOjpzdHJpbmcgY21kOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewpAQCAtMzE0LDcgKzMxMyw3IEBACiAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICB9CiAgICAgfQotICAgIEZJTEUqIGZwID0gcG9wZW4oY21kLmNfc3RyKCksICJyIik7IC8vIE5PTElOVAorICAgIEZJTEUqIGZwID0gcG9wZW4oY21kLmNfc3RyKCksICJyIik7ICAvLyBOT0xJTlQKICAgICBpZiAoY29udGV4dCkgewogICAgICAgICBpZiAoc2V0ZXhlY2NvbihudWxscHRyKSkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldGV4ZWNjb24iOwpAQCAtMzQxLDkgKzM0MCw5IEBACiAKIHBpZF90IEZvcmtFeGVjdnBBc3luYyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKICAgICBzaXplX3QgYXJnYyA9IGFyZ3Muc2l6ZSgpOwotICAgIGNoYXIqKiBhcmd2ID0gKGNoYXIqKikgY2FsbG9jKGFyZ2MgKyAxLCBzaXplb2YoY2hhciopKTsKKyAgICBjaGFyKiogYXJndiA9IChjaGFyKiopY2FsbG9jKGFyZ2MgKyAxLCBzaXplb2YoY2hhciopKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBhcmd2W2ldID0gKGNoYXIqKSBhcmdzW2ldLmNfc3RyKCk7CisgICAgICAgIGFyZ3ZbaV0gPSAoY2hhciopYXJnc1tpXS5jX3N0cigpOwogICAgICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgYXJnc1tpXTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQwMCwxMCArMzk5LDEwIEBACiBzdGF0dXNfdCBHZW5lcmF0ZVJhbmRvbVV1aWQoc3RkOjpzdHJpbmcmIG91dCkgewogICAgIHN0YXR1c190IHJlcyA9IFJlYWRSYW5kb21CeXRlcygxNiwgb3V0KTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIG91dFs2XSAmPSAweDBmOyAgLyogY2xlYXIgdmVyc2lvbiAgICAgICAgKi8KLSAgICAgICAgb3V0WzZdIHw9IDB4NDA7ICAvKiBzZXQgdG8gdmVyc2lvbiA0ICAgICAqLwotICAgICAgICBvdXRbOF0gJj0gMHgzZjsgIC8qIGNsZWFyIHZhcmlhbnQgICAgICAgICovCi0gICAgICAgIG91dFs4XSB8PSAweDgwOyAgLyogc2V0IHRvIElFVEYgdmFyaWFudCAgKi8KKyAgICAgICAgb3V0WzZdICY9IDB4MGY7IC8qIGNsZWFyIHZlcnNpb24gICAgICAgICovCisgICAgICAgIG91dFs2XSB8PSAweDQwOyAvKiBzZXQgdG8gdmVyc2lvbiA0ICAgICAqLworICAgICAgICBvdXRbOF0gJj0gMHgzZjsgLyogY2xlYXIgdmFyaWFudCAgICAgICAgKi8KKyAgICAgICAgb3V0WzhdIHw9IDB4ODA7IC8qIHNldCB0byBJRVRGIHZhcmlhbnQgICovCiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CkBAIC00MTUsMjQgKzQxNCwyNiBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGV4LnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGludCB2YWwgPSAwOwogICAgICAgICBzd2l0Y2ggKGhleFtpXSkgewotICAgICAgICBjYXNlICcgJzogY2FzZSAnLSc6IGNhc2UgJzonOiBjb250aW51ZTsKLSAgICAgICAgY2FzZSAnZic6IGNhc2UgJ0YnOiB2YWwgPSAxNTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogdmFsID0gMTQ7IGJyZWFrOwotICAgICAgICBjYXNlICdkJzogY2FzZSAnRCc6IHZhbCA9IDEzOyBicmVhazsKLSAgICAgICAgY2FzZSAnYyc6IGNhc2UgJ0MnOiB2YWwgPSAxMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2InOiBjYXNlICdCJzogdmFsID0gMTE7IGJyZWFrOwotICAgICAgICBjYXNlICdhJzogY2FzZSAnQSc6IHZhbCA9IDEwOyBicmVhazsKLSAgICAgICAgY2FzZSAnOSc6IHZhbCA9IDk7IGJyZWFrOwotICAgICAgICBjYXNlICc4JzogdmFsID0gODsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzcnOiB2YWwgPSA3OyBicmVhazsKLSAgICAgICAgY2FzZSAnNic6IHZhbCA9IDY7IGJyZWFrOwotICAgICAgICBjYXNlICc1JzogdmFsID0gNTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzQnOiB2YWwgPSA0OyBicmVhazsKLSAgICAgICAgY2FzZSAnMyc6IHZhbCA9IDM7IGJyZWFrOwotICAgICAgICBjYXNlICcyJzogdmFsID0gMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzEnOiB2YWwgPSAxOyBicmVhazsKLSAgICAgICAgY2FzZSAnMCc6IHZhbCA9IDA7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICAgICAgICAgIGNhc2UgJyAnOiBjYXNlICctJzogY2FzZSAnOic6IGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAnZic6IGNhc2UgJ0YnOiB2YWwgPSAxNTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdlJzogY2FzZSAnRSc6IHZhbCA9IDE0OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2QnOiBjYXNlICdEJzogdmFsID0gMTM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnYyc6IGNhc2UgJ0MnOiB2YWwgPSAxMjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdiJzogY2FzZSAnQic6IHZhbCA9IDExOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2EnOiBjYXNlICdBJzogdmFsID0gMTA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnOSc6IHZhbCA9IDk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnOCc6IHZhbCA9IDg7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNyc6IHZhbCA9IDc7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNic6IHZhbCA9IDY7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNSc6IHZhbCA9IDU7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNCc6IHZhbCA9IDQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMyc6IHZhbCA9IDM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMic6IHZhbCA9IDI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMSc6IHZhbCA9IDE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMCc6IHZhbCA9IDA7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXZlbikgewpAQCAtNDc4LDcgKzQ3OSw3IEBACiB1aW50NjRfdCBHZXRGcmVlQnl0ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKICAgICBzdHJ1Y3Qgc3RhdHZmcyBzYjsKICAgICBpZiAoc3RhdHZmcyhwYXRoLmNfc3RyKCksICZzYikgPT0gMCkgewotICAgICAgICByZXR1cm4gKHVpbnQ2NF90KSBzYi5mX2JhdmFpbCAqIHNiLmZfZnJzaXplOworICAgICAgICByZXR1cm4gKHVpbnQ2NF90KXNiLmZfYmF2YWlsICogc2IuZl9mcnNpemU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTQ4Niw3ICs0ODcsNyBAQAogCiAvLyBUT0RPOiBib3Jyb3dlZCBmcm9tIGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZGlza3VzYWdlLyB3aGljaCBzaG91bGQKIC8vIGV2ZW50dWFsbHkgYmUgbWlncmF0ZWQgaW50byBzeXN0ZW0vCi1zdGF0aWMgaW50NjRfdCBzdGF0X3NpemUoc3RydWN0IHN0YXQgKnMpIHsKK3N0YXRpYyBpbnQ2NF90IHN0YXRfc2l6ZShzdHJ1Y3Qgc3RhdCogcykgewogICAgIGludDY0X3QgYmxrc2l6ZSA9IHMtPnN0X2Jsa3NpemU7CiAgICAgLy8gY291bnQgYWN0dWFsIGJsb2NrcyB1c2VkIGluc3RlYWQgb2Ygbm9taW5hbCBmaWxlIHNpemUKICAgICBpbnQ2NF90IHNpemUgPSBzLT5zdF9ibG9ja3MgKiA1MTI7CkBAIC01MDQsOCArNTA1LDggQEAKIGludDY0X3QgY2FsY3VsYXRlX2Rpcl9zaXplKGludCBkZmQpIHsKICAgICBpbnQ2NF90IHNpemUgPSAwOwogICAgIHN0cnVjdCBzdGF0IHM7Ci0gICAgRElSICpkOwotICAgIHN0cnVjdCBkaXJlbnQgKmRlOworICAgIERJUiogZDsKKyAgICBzdHJ1Y3QgZGlyZW50KiBkZTsKIAogICAgIGQgPSBmZG9wZW5kaXIoZGZkKTsKICAgICBpZiAoZCA9PSBOVUxMKSB7CkBAIC01MTQsNyArNTE1LDcgQEAKICAgICB9CiAKICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpIHsKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGRlLT5kX25hbWU7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZS0+ZF9uYW1lOwogICAgICAgICBpZiAoZnN0YXRhdChkZmQsIG5hbWUsICZzLCBBVF9TWU1MSU5LX05PRk9MTE9XKSA9PSAwKSB7CiAgICAgICAgICAgICBzaXplICs9IHN0YXRfc2l6ZSgmcyk7CiAgICAgICAgIH0KQEAgLTUyMywxMCArNTI0LDggQEAKIAogICAgICAgICAgICAgLyogYWx3YXlzIHNraXAgIi4iIGFuZCAiLi4iICovCiAgICAgICAgICAgICBpZiAobmFtZVswXSA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoKG5hbWVbMV0gPT0gJy4nKSAmJiAobmFtZVsyXSA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKChuYW1lWzFdID09ICcuJykgJiYgKG5hbWVbMl0gPT0gMCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdWJmZCA9IG9wZW5hdChkZmQsIG5hbWUsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkgfCBPX0NMT0VYRUMpOwpAQCAtNTc2LDcgKzU3NSw3IEBACiAgICAgfQogCiAgICAgcmFuZ2VbMF0gPSAwOwotICAgIHJhbmdlWzFdID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgbnJfc2VjICogNTEyOworICAgIHJhbmdlWzFdID0gKHVuc2lnbmVkIGxvbmcgbG9uZylucl9zZWMgKiA1MTI7CiAKICAgICBMT0coSU5GTykgPDwgIkFib3V0IHRvIGRpc2NhcmQgIiA8PCByYW5nZVsxXSA8PCAiIG9uICIgPDwgcGF0aDsKICAgICBpZiAoaW9jdGwoZmQsIEJMS0RJU0NBUkQsICZyYW5nZSkgPT0gMCkgewpAQCAtNTkyLDggKzU5MSw3IEBACiB9CiAKIHN0YXRpYyBib29sIGlzVmFsaWRGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIGlmIChuYW1lLmVtcHR5KCkgfHwgKG5hbWUgPT0gIi4iKSB8fCAobmFtZSA9PSAiLi4iKQotICAgICAgICAgICAgfHwgKG5hbWUuZmluZCgnLycpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgIGlmIChuYW1lLmVtcHR5KCkgfHwgKG5hbWUgPT0gIi4iKSB8fCAobmFtZSA9PSAiLi4iKSB8fCAobmFtZS5maW5kKCcvJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTcxMyw4ICs3MTEsNyBAQAogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIHNzaXplX3Qgc2l6ZSA9IHJlYWRsaW5rYXQoZGlyZmQsIHBhdGguY19zdHIoKSwgJmJ1ZlswXSwgYnVmLnNpemUoKSk7CiAgICAgICAgIC8vIFVucmVjb3ZlcmFibGUgZXJyb3I/Ci0gICAgICAgIGlmIChzaXplID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoc2l6ZSA9PSAtMSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAvLyBJdCBmaXQhIChJZiBzaXplID09IGJ1Zi5zaXplKCksIGl0IG1heSBoYXZlIGJlZW4gdHJ1bmNhdGVkLikKICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oc2l6ZSkgPCBidWYuc2l6ZSgpKSB7CiAgICAgICAgICAgICByZXN1bHQtPmFzc2lnbigmYnVmWzBdLCBzaXplKTsKZGlmZiAtLWdpdCBhL1V0aWxzLmggYi9VdGlscy5oCmluZGV4IDVjYWE0ZTkuLjA5Y2U4ZmEgMTAwNjQ0Ci0tLSBhL1V0aWxzLmgKKysrIGIvVXRpbHMuaApAQCAtMjAsMTIgKzIwLDEyIEBACiAjaW5jbHVkZSAiS2V5QnVmZmVyLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCi0jaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIHN0cnVjdCBESVI7CiAKQEAgLTU5LDIxICs1OSwyMCBAQAogYm9vbCBGaW5kVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdywgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIHZhbHVlKTsKIAogLyogUmVhZHMgZmlsZXN5c3RlbSBtZXRhZGF0YSBmcm9tIGRldmljZSBhdCBwYXRoICovCi1zdGF0dXNfdCBSZWFkTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsCi0gICAgICAgIHN0ZDo6c3RyaW5nKiBmc1V1aWQsIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKTsKK3N0YXR1c190IFJlYWRNZXRhZGF0YShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwgc3RkOjpzdHJpbmcqIGZzVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZnNMYWJlbCk7CiAKIC8qIFJlYWRzIGZpbGVzeXN0ZW0gbWV0YWRhdGEgZnJvbSB1bnRydXN0ZWQgZGV2aWNlIGF0IHBhdGggKi8KLXN0YXR1c190IFJlYWRNZXRhZGF0YVVudHJ1c3RlZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwKLSAgICAgICAgc3RkOjpzdHJpbmcqIGZzVXVpZCwgc3RkOjpzdHJpbmcqIGZzTGFiZWwpOworc3RhdHVzX3QgUmVhZE1ldGFkYXRhVW50cnVzdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLCBzdGQ6OnN0cmluZyogZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKTsKIAogLyogUmV0dXJucyBlaXRoZXIgV0VYSVRTVEFUVVMoKSBzdGF0dXMsIG9yIGEgbmVnYXRpdmUgZXJybm8gKi8KIHN0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKIHN0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLCBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCk7CiAKLXN0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG91dHB1dCk7Ci1zdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQsIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KTsKK3N0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG91dHB1dCk7CitzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KTsKIAogcGlkX3QgRm9ya0V4ZWN2cEFzeW5jKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7CiAKZGlmZiAtLWdpdCBhL1ZvbGROYXRpdmVTZXJ2aWNlLmNwcCBiL1ZvbGROYXRpdmVTZXJ2aWNlLmNwcAppbmRleCA4MTUyM2M2Li4xYTE1MzA0IDEwMDY0NAotLS0gYS9Wb2xkTmF0aXZlU2VydmljZS5jcHAKKysrIGIvVm9sZE5hdGl2ZVNlcnZpY2UuY3BwCkBAIC0yNCw5ICsyNCw5IEBACiAjaW5jbHVkZSAiUHJvY2Vzcy5oIgogI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKIAotI2luY2x1ZGUgImNyeXB0ZnMuaCIKICNpbmNsdWRlICJFeHQ0Q3J5cHQuaCIKICNpbmNsdWRlICJNZXRhZGF0YUNyeXB0LmgiCisjaW5jbHVkZSAiY3J5cHRmcy5oIgogCiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDx0aHJlYWQ+CkBAIC04MywxMSArODMsMTEgQEAKICAgICB1aWRfdCB1aWQ7CiAKICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNihwZXJtaXNzaW9uKSwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJnBpZCksCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmdWlkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmdWlkKSkpIHsKICAgICAgICAgcmV0dXJuIG9rKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihiaW5kZXI6OlN0YXR1czo6RVhfU0VDVVJJVFksCi0gICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJVSUQgJWQgLyBQSUQgJWQgbGFja3MgcGVybWlzc2lvbiAlcyIsIHVpZCwgcGlkLCBwZXJtaXNzaW9uKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJVSUQgJWQgLyBQSUQgJWQgbGFja3MgcGVybWlzc2lvbiAlcyIsIHVpZCwgcGlkLCBwZXJtaXNzaW9uKSk7CiAgICAgfQogfQogCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICAgIHJldHVybiBvaygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBleGNlcHRpb24oYmluZGVyOjpTdGF0dXM6OkVYX1NFQ1VSSVRZLAotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiVUlEICVkIGlzIG5vdCBleHBlY3RlZCBVSUQgJWQiLCB1aWQsIGV4cGVjdGVkVWlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJVSUQgJWQgaXMgbm90IGV4cGVjdGVkIFVJRCAlZCIsIHVpZCwgZXhwZWN0ZWRVaWQpKTsKICAgICB9CiB9CiAKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgIGZvciAoY29uc3QgY2hhciYgYyA6IGlkKSB7CiAgICAgICAgIGlmICghc3RkOjppc2FsbnVtKGMpICYmIGMgIT0gJzonICYmIGMgIT0gJywnKSB7CiAgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIklEICVzIGlzIG1hbGZvcm1lZCIsIGlkLmNfc3RyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJJRCAlcyBpcyBtYWxmb3JtZWQiLCBpZC5jX3N0cigpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG9rKCk7CkBAIC0xMjAsMTYgKzEyMCwxNiBAQAogICAgIH0KICAgICBpZiAocGF0aFswXSAhPSAnLycpIHsKICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihiaW5kZXI6OlN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlBhdGggJXMgaXMgcmVsYXRpdmUiLCBwYXRoLmNfc3RyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlBhdGggJXMgaXMgcmVsYXRpdmUiLCBwYXRoLmNfc3RyKCkpKTsKICAgICB9CiAgICAgaWYgKChwYXRoICsgJy8nKS5maW5kKCIvLi4vIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihiaW5kZXI6OlN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlBhdGggJXMgaXMgc2hhZHkiLCBwYXRoLmNfc3RyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlBhdGggJXMgaXMgc2hhZHkiLCBwYXRoLmNfc3RyKCkpKTsKICAgICB9CiAgICAgZm9yIChjb25zdCBjaGFyJiBjIDogcGF0aCkgewogICAgICAgICBpZiAoYyA9PSAnXDAnIHx8IGMgPT0gJ1xuJykgewogICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihiaW5kZXI6OlN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJQYXRoICVzIGlzIG1hbGZvcm1lZCIsIHBhdGguY19zdHIoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlBhdGggJXMgaXMgbWFsZm9ybWVkIiwgcGF0aC5jX3N0cigpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG9rKCk7CkBAIC0xNDAsNDUgKzE0MCw0OSBAQAogICAgIGZvciAoY29uc3QgY2hhciYgYyA6IGhleCkgewogICAgICAgICBpZiAoIXN0ZDo6aXN4ZGlnaXQoYykgJiYgYyAhPSAnOicgJiYgYyAhPSAnLScpIHsKICAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24oYmluZGVyOjpTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiSGV4ICVzIGlzIG1hbGZvcm1lZCIsIGhleC5jX3N0cigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiSGV4ICVzIGlzIG1hbGZvcm1lZCIsIGhleC5jX3N0cigpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG9rKCk7CiB9CiAKLSNkZWZpbmUgRU5GT1JDRV9VSUQodWlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBjaGVja1VpZCgodWlkKSk7ICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgRU5GT1JDRV9VSUQodWlkKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBjaGVja1VpZCgodWlkKSk7IFwKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKLSNkZWZpbmUgQ0hFQ0tfQVJHVU1FTlRfSUQoaWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBjaGVja0FyZ3VtZW50SWQoKGlkKSk7ICAgICAgICAgIFwKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgQ0hFQ0tfQVJHVU1FTlRfSUQoaWQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBjaGVja0FyZ3VtZW50SWQoKGlkKSk7IFwKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKLSNkZWZpbmUgQ0hFQ0tfQVJHVU1FTlRfUEFUSChwYXRoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBjaGVja0FyZ3VtZW50UGF0aCgocGF0aCkpOyAgICAgIFwKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgQ0hFQ0tfQVJHVU1FTlRfUEFUSChwYXRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRQYXRoKChwYXRoKSk7IFwKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKLSNkZWZpbmUgQ0hFQ0tfQVJHVU1FTlRfSEVYKGhleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBjaGVja0FyZ3VtZW50SGV4KChoZXgpKTsgICAgICAgIFwKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgQ0hFQ0tfQVJHVU1FTlRfSEVYKGhleCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gY2hlY2tBcmd1bWVudEhleCgoaGV4KSk7IFwKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKLSNkZWZpbmUgQUNRVUlSRV9MT0NLIFwKKyNkZWZpbmUgQUNRVUlSRV9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+Z2V0TG9jaygpKTsgXAogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSNkZWZpbmUgQUNRVUlSRV9DUllQVF9MT0NLIFwKKyNkZWZpbmUgQUNRVUlSRV9DUllQVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5nZXRDcnlwdExvY2soKSk7IFwKICAgICBBVFJBQ0VfQ0FMTCgpOwogCkBAIC0xOTYsNyArMjAwLDcgQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLXN0YXR1c190IFZvbGROYXRpdmVTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmIC8qIGFyZ3MgKi8pIHsKK3N0YXR1c190IFZvbGROYXRpdmVTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyogYXJncyAqLykgewogICAgIGF1dG8gb3V0ID0gc3RkOjpmc3RyZWFtKFN0cmluZ1ByaW50ZigiL3Byb2Mvc2VsZi9mZC8lZCIsIGZkKSk7CiAgICAgY29uc3QgYmluZGVyOjpTdGF0dXMgZHVtcF9wZXJtaXNzaW9uID0gY2hlY2tQZXJtaXNzaW9uKGtEdW1wKTsKICAgICBpZiAoIWR1bXBfcGVybWlzc2lvbi5pc09rKCkpIHsKQEAgLTIxMSw3ICsyMTUsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6c2V0TGlzdGVuZXIoCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9MT0NLOwogCkBAIC0yMjMsMTIgKzIyNyw4IEBACiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAKICAgICAvLyBTaW1wbHkgYWNxdWlyZS9yZWxlYXNlIGVhY2ggbG9jayBmb3Igd2F0Y2hkb2cKLSAgICB7Ci0gICAgICAgIEFDUVVJUkVfTE9DSzsKLSAgICB9Ci0gICAgewotICAgICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7Ci0gICAgfQorICAgIHsgQUNRVUlSRV9MT0NLOyB9CisgICAgeyBBQ1FVSVJFX0NSWVBUX0xPQ0s7IH0KIAogICAgIHJldHVybiBvaygpOwogfQpAQCAtMjgzLDcgKzI4Myw3IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpwYXJ0aXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRpc2tJZCwgaW50MzJfdCBwYXJ0aXRpb25UeXBlLAotICAgICAgICBpbnQzMl90IHJhdGlvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmF0aW8pIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBDSEVDS19BUkdVTUVOVF9JRChkaXNrSWQpOwogICAgIEFDUVVJUkVfTE9DSzsKQEAgLTI5MywxNSArMjkzLDE5IEBACiAgICAgICAgIHJldHVybiBlcnJvcigiRmFpbGVkIHRvIGZpbmQgZGlzayAiICsgZGlza0lkKTsKICAgICB9CiAgICAgc3dpdGNoIChwYXJ0aXRpb25UeXBlKSB7Ci0gICAgY2FzZSBQQVJUSVRJT05fVFlQRV9QVUJMSUM6IHJldHVybiB0cmFuc2xhdGUoZGlzay0+cGFydGl0aW9uUHVibGljKCkpOwotICAgIGNhc2UgUEFSVElUSU9OX1RZUEVfUFJJVkFURTogcmV0dXJuIHRyYW5zbGF0ZShkaXNrLT5wYXJ0aXRpb25Qcml2YXRlKCkpOwotICAgIGNhc2UgUEFSVElUSU9OX1RZUEVfTUlYRUQ6IHJldHVybiB0cmFuc2xhdGUoZGlzay0+cGFydGl0aW9uTWl4ZWQocmF0aW8pKTsKLSAgICBkZWZhdWx0OiByZXR1cm4gZXJyb3IoIlVua25vd24gdHlwZSAiICsgc3RkOjp0b19zdHJpbmcocGFydGl0aW9uVHlwZSkpOworICAgICAgICBjYXNlIFBBUlRJVElPTl9UWVBFX1BVQkxJQzoKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGUoZGlzay0+cGFydGl0aW9uUHVibGljKCkpOworICAgICAgICBjYXNlIFBBUlRJVElPTl9UWVBFX1BSSVZBVEU6CisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlKGRpc2stPnBhcnRpdGlvblByaXZhdGUoKSk7CisgICAgICAgIGNhc2UgUEFSVElUSU9OX1RZUEVfTUlYRUQ6CisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlKGRpc2stPnBhcnRpdGlvbk1peGVkKHJhdGlvKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIlVua25vd24gdHlwZSAiICsgc3RkOjp0b19zdHJpbmcocGFydGl0aW9uVHlwZSkpOwogICAgIH0KIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZvcmdldFBhcnRpdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgcGFydEd1aWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1V1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIENIRUNLX0FSR1VNRU5UX0hFWChwYXJ0R3VpZCk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSEVYKGZzVXVpZCk7CkBAIC0zMTEsNyArMzE1LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCwgaW50MzJfdCBtb3VudEZsYWdzLAotICAgICAgICBpbnQzMl90IG1vdW50VXNlcklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtb3VudFVzZXJJZCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIENIRUNLX0FSR1VNRU5UX0lEKHZvbElkKTsKICAgICBBQ1FVSVJFX0xPQ0s7CkBAIC0zODcsOSArMzkxLDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IHBhdGhGb3JWb2xJZCh2b2xJZCwgJnBhdGgpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgcmV0dXJuIHN0YXR1czsKIAotICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsKLSAgICAgICAgYW5kcm9pZDo6dm9sZDo6QmVuY2htYXJrKHBhdGgsIGxpc3RlbmVyKTsKLSAgICB9KS5kZXRhY2goKTsKKyAgICBzdGQ6OnRocmVhZChbPV0oKSB7IGFuZHJvaWQ6OnZvbGQ6OkJlbmNobWFyayhwYXRoLCBsaXN0ZW5lcik7IH0pLmRldGFjaCgpOwogICAgIHJldHVybiBvaygpOwogfQogCkBAIC00MDQsOCArNDA2LDkgQEAKICAgICByZXR1cm4gdHJhbnNsYXRlKGFuZHJvaWQ6OnZvbGQ6OkNoZWNrRW5jcnlwdGlvbihwYXRoKSk7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjptb3ZlU3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgZnJvbVZvbElkLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG9Wb2xJZCwgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjptb3ZlU3RvcmFnZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnJvbVZvbElkLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9Wb2xJZCwKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIENIRUNLX0FSR1VNRU5UX0lEKGZyb21Wb2xJZCk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSUQodG9Wb2xJZCk7CkBAIC00MTksOSArNDIyLDcgQEAKICAgICAgICAgcmV0dXJuIGVycm9yKCJGYWlsZWQgdG8gZmluZCB2b2x1bWUgIiArIHRvVm9sSWQpOwogICAgIH0KIAotICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsKLSAgICAgICAgYW5kcm9pZDo6dm9sZDo6TW92ZVN0b3JhZ2UoZnJvbVZvbCwgdG9Wb2wsIGxpc3RlbmVyKTsKLSAgICB9KS5kZXRhY2goKTsKKyAgICBzdGQ6OnRocmVhZChbPV0oKSB7IGFuZHJvaWQ6OnZvbGQ6Ok1vdmVTdG9yYWdlKGZyb21Wb2wsIHRvVm9sLCBsaXN0ZW5lcik7IH0pLmRldGFjaCgpOwogICAgIHJldHVybiBvaygpOwogfQogCkBAIC00MzEsMTEgKzQzMiwyMCBAQAogCiAgICAgc3RkOjpzdHJpbmcgdG1wOwogICAgIHN3aXRjaCAocmVtb3VudE1vZGUpIHsKLSAgICBjYXNlIFJFTU9VTlRfTU9ERV9OT05FOiB0bXAgPSAibm9uZSI7IGJyZWFrOwotICAgIGNhc2UgUkVNT1VOVF9NT0RFX0RFRkFVTFQ6IHRtcCA9ICJkZWZhdWx0IjsgYnJlYWs7Ci0gICAgY2FzZSBSRU1PVU5UX01PREVfUkVBRDogdG1wID0gInJlYWQiOyBicmVhazsKLSAgICBjYXNlIFJFTU9VTlRfTU9ERV9XUklURTogdG1wID0gIndyaXRlIjsgYnJlYWs7Ci0gICAgZGVmYXVsdDogcmV0dXJuIGVycm9yKCJVbmtub3duIG1vZGUgIiArIHN0ZDo6dG9fc3RyaW5nKHJlbW91bnRNb2RlKSk7CisgICAgICAgIGNhc2UgUkVNT1VOVF9NT0RFX05PTkU6CisgICAgICAgICAgICB0bXAgPSAibm9uZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRU1PVU5UX01PREVfREVGQVVMVDoKKyAgICAgICAgICAgIHRtcCA9ICJkZWZhdWx0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFTU9VTlRfTU9ERV9SRUFEOgorICAgICAgICAgICAgdG1wID0gInJlYWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVNT1VOVF9NT0RFX1dSSVRFOgorICAgICAgICAgICAgdG1wID0gIndyaXRlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKCJVbmtub3duIG1vZGUgIiArIHN0ZDo6dG9fc3RyaW5nKHJlbW91bnRNb2RlKSk7CiAgICAgfQogICAgIHJldHVybiB0cmFuc2xhdGUoVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3VudFVpZCh1aWQsIHRtcCkpOwogfQpAQCAtNDQ5LDE0ICs0NTksMTUgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmNyZWF0ZU9iYihjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZUtleSwgaW50MzJfdCBvd25lckdpZCwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LCBpbnQzMl90IG93bmVyR2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfUEFUSChzb3VyY2VQYXRoKTsKICAgICBDSEVDS19BUkdVTUVOVF9IRVgoc291cmNlS2V5KTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKICAgICByZXR1cm4gdHJhbnNsYXRlKAotICAgICAgICAgICAgVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+Y3JlYXRlT2JiKHNvdXJjZVBhdGgsIHNvdXJjZUtleSwgb3duZXJHaWQsIF9haWRsX3JldHVybikpOworICAgICAgICBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5jcmVhdGVPYmIoc291cmNlUGF0aCwgc291cmNlS2V5LCBvd25lckdpZCwgX2FpZGxfcmV0dXJuKSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpkZXN0cm95T2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCkgewpAQCAtNDY3LDQxICs0NzgsMzUgQEAKICAgICByZXR1cm4gdHJhbnNsYXRlKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPmRlc3Ryb3lPYmIodm9sSWQpKTsKIH0KIAotYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZzdHJpbShpbnQzMl90IGZzdHJpbUZsYWdzLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZzdHJpbSgKKyAgICBpbnQzMl90IGZzdHJpbUZsYWdzLCBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIAotICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsKLSAgICAgICAgYW5kcm9pZDo6dm9sZDo6VHJpbShsaXN0ZW5lcik7Ci0gICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoWz1dKCkgeyBhbmRyb2lkOjp2b2xkOjpUcmltKGxpc3RlbmVyKTsgfSkuZGV0YWNoKCk7CiAgICAgcmV0dXJuIG9rKCk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpydW5JZGxlTWFpbnQoCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKLSAgICBzdGQ6OnRocmVhZChbPV0oKSB7Ci0gICAgICAgIGFuZHJvaWQ6OnZvbGQ6OlJ1bklkbGVNYWludChsaXN0ZW5lcik7Ci0gICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoWz1dKCkgeyBhbmRyb2lkOjp2b2xkOjpSdW5JZGxlTWFpbnQobGlzdGVuZXIpOyB9KS5kZXRhY2goKTsKICAgICByZXR1cm4gb2soKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmFib3J0SWRsZU1haW50KAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9MT0NLOwogCi0gICAgc3RkOjp0aHJlYWQoWz1dKCkgewotICAgICAgICBhbmRyb2lkOjp2b2xkOjpBYm9ydElkbGVNYWludChsaXN0ZW5lcik7Ci0gICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoWz1dKCkgeyBhbmRyb2lkOjp2b2xkOjpBYm9ydElkbGVNYWludChsaXN0ZW5lcik7IH0pLmRldGFjaCgpOwogICAgIHJldHVybiBvaygpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bW91bnRBcHBGdXNlKGludDMyX3QgdWlkLCBpbnQzMl90IHBpZCwgaW50MzJfdCBtb3VudElkLAotICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIF9haWRsX3JldHVybikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIF9haWRsX3JldHVybikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIApAQCAtNTQxLDcgKzU0Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZmRlRW5hYmxlSW50ZXJuYWwoaW50MzJfdCBwYXNzd29yZFR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCwKLSAgICAgICAgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpIHsKICAgICBib29sIG5vVWkgPSAoZW5jcnlwdGlvbkZsYWdzICYgVm9sZE5hdGl2ZVNlcnZpY2U6OkVOQ1JZUFRJT05fRkxBR19OT19VSSkgIT0gMDsKIAogICAgIGZvciAoaW50IHRyaWVzID0gMDsgdHJpZXMgPCAyOyArK3RyaWVzKSB7CkBAIC01NjIsOCArNTY3LDggQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmZGVFbmFibGUoaW50MzJfdCBwYXNzd29yZFR5cGUsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCwgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpIHsKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmZGVFbmFibGUoaW50MzJfdCBwYXNzd29yZFR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKQEAgLTU4MSw3ICs1ODYsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlQ2hhbmdlUGFzc3dvcmQoaW50MzJfdCBwYXNzd29yZFR5cGUsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIApAQCAtNTk1LDggKzYwMCw3IEBACiAgICAgcmV0dXJuIHRyYW5zbGF0ZShjcnlwdGZzX3ZlcmlmeV9wYXNzd2QocGFzc3dvcmQuY19zdHIoKSkpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlR2V0RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZUdldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKQEAgLTYwOSw4ICs2MTMsNyBAQAogICAgIH0KIH0KIAotYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZVNldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZVNldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIApAQCAtNjkyLDggKzY5NSw3IEBACiAgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZTRjcnlwdF9tb3VudF9tZXRhZGF0YV9lbmNyeXB0ZWQobW91bnRQb2ludCwgdHJ1ZSkpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6Y3JlYXRlVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLAotICAgICAgICBib29sIGVwaGVtZXJhbCkgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmNyZWF0ZVVzZXJLZXkoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwgYm9vbCBlcGhlbWVyYWwpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKQEAgLTcwOCw3ICs3MTAsOCBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6YWRkVXNlcktleUF1dGgoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKQEAgLTcyMyw3ICs3MjYsOCBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6dW5sb2NrVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKQEAgLTczOCw3ICs3NDIsOCBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6cHJlcGFyZVVzZXJTdG9yYWdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4mIHV1aWQsCi0gICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsIGludDMyX3QgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFncykgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIHN0ZDo6c3RyaW5nIGVtcHR5X3N0cmluZyA9ICIiOwogICAgIGF1dG8gdXVpZF8gPSB1dWlkID8gKnV1aWQgOiBlbXB0eV9zdHJpbmc7CkBAIC03NDksNyArNzU0LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmRlc3Ryb3lVc2VyU3RvcmFnZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+JiB1dWlkLAotICAgICAgICBpbnQzMl90IHVzZXJJZCwgaW50MzJfdCBmbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVzZXJJZCwgaW50MzJfdCBmbGFncykgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIHN0ZDo6c3RyaW5nIGVtcHR5X3N0cmluZyA9ICIiOwogICAgIGF1dG8gdXVpZF8gPSB1dWlkID8gKnV1aWQgOiBlbXB0eV9zdHJpbmc7CmRpZmYgLS1naXQgYS9Wb2xkTmF0aXZlU2VydmljZS5oIGIvVm9sZE5hdGl2ZVNlcnZpY2UuaAppbmRleCAyZTkwMTAxLi4wYTA4MGUxIDEwMDY0NAotLS0gYS9Wb2xkTmF0aXZlU2VydmljZS5oCisrKyBiL1ZvbGROYXRpdmVTZXJ2aWNlLmgKQEAgLTI2LDEwICsyNiwxMCBAQAogbmFtZXNwYWNlIHZvbGQgewogCiBjbGFzcyBWb2xkTmF0aXZlU2VydmljZSA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPFZvbGROYXRpdmVTZXJ2aWNlPiwgcHVibGljIG9zOjpCblZvbGQgewotcHVibGljOgorICBwdWJsaWM6CiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0KCk7CiAgICAgc3RhdGljIGNoYXIgY29uc3QqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gInZvbGQiOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRMaXN0ZW5lcihjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKIApAQCAtNTEsMzggKzUxLDM1IEBACiAgICAgYmluZGVyOjpTdGF0dXMgdW5tb3VudChjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1R5cGUpOwogICAgIGJpbmRlcjo6U3RhdHVzIGJlbmNobWFyayhjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQsCi0gICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKICAgICBiaW5kZXI6OlN0YXR1cyBjaGVja0VuY3J5cHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIG1vdmVTdG9yYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tVm9sSWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b1ZvbElkLAotICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIHJlbW91bnRVaWQoaW50MzJfdCB1aWQsIGludDMyX3QgcmVtb3VudE1vZGUpOwogCiAgICAgYmluZGVyOjpTdGF0dXMgbWtkaXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZU9iYihjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZUtleSwKLSAgICAgICAgICAgIGludDMyX3Qgb3duZXJHaWQsIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG93bmVyR2lkLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKTsKICAgICBiaW5kZXI6OlN0YXR1cyBkZXN0cm95T2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCk7CiAKICAgICBiaW5kZXI6OlN0YXR1cyBmc3RyaW0oaW50MzJfdCBmc3RyaW1GbGFncywKLSAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKLSAgICBiaW5kZXI6OlN0YXR1cyBydW5JZGxlTWFpbnQoCi0gICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7Ci0gICAgYmluZGVyOjpTdGF0dXMgYWJvcnRJZGxlTWFpbnQoCi0gICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBydW5JZGxlTWFpbnQoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIGJpbmRlcjo6U3RhdHVzIGFib3J0SWRsZU1haW50KGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIG1vdW50QXBwRnVzZShpbnQzMl90IHVpZCwgaW50MzJfdCBwaWQsIGludDMyX3QgbW91bnRJZCwKLSAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogX2FpZGxfcmV0dXJuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBfYWlkbF9yZXR1cm4pOwogICAgIGJpbmRlcjo6U3RhdHVzIHVubW91bnRBcHBGdXNlKGludDMyX3QgdWlkLCBpbnQzMl90IHBpZCwgaW50MzJfdCBtb3VudElkKTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIGZkZUNoZWNrUGFzc3dvcmQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkKTsKICAgICBiaW5kZXI6OlN0YXR1cyBmZGVSZXN0YXJ0KCk7CiAgICAgYmluZGVyOjpTdGF0dXMgZmRlQ29tcGxldGUoaW50MzJfdCogX2FpZGxfcmV0dXJuKTsKLSAgICBiaW5kZXI6OlN0YXR1cyBmZGVFbmFibGUoaW50MzJfdCBwYXNzd29yZFR5cGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsIGludDMyX3QgZW5jcnlwdGlvbkZsYWdzKTsKLSAgICBiaW5kZXI6OlN0YXR1cyBmZGVDaGFuZ2VQYXNzd29yZChpbnQzMl90IHBhc3N3b3JkVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCk7CisgICAgYmluZGVyOjpTdGF0dXMgZmRlRW5hYmxlKGludDMyX3QgcGFzc3dvcmRUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGlvbkZsYWdzKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBmZGVDaGFuZ2VQYXNzd29yZChpbnQzMl90IHBhc3N3b3JkVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkKTsKICAgICBiaW5kZXI6OlN0YXR1cyBmZGVWZXJpZnlQYXNzd29yZChjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGZkZUdldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pOwogICAgIGJpbmRlcjo6U3RhdHVzIGZkZVNldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CkBAIC0xMDEsMTggKzk4LDE4IEBACiAgICAgYmluZGVyOjpTdGF0dXMgY3JlYXRlVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLCBib29sIGVwaGVtZXJhbCk7CiAgICAgYmluZGVyOjpTdGF0dXMgZGVzdHJveVVzZXJLZXkoaW50MzJfdCB1c2VySWQpOwogCi0gICAgYmluZGVyOjpTdGF0dXMgYWRkVXNlcktleUF1dGgoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCk7CisgICAgYmluZGVyOjpTdGF0dXMgYWRkVXNlcktleUF1dGgoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGZpeGF0ZU5ld2VzdFVzZXJLZXlBdXRoKGludDMyX3QgdXNlcklkKTsKIAotICAgIGJpbmRlcjo6U3RhdHVzIHVubG9ja1VzZXJLZXkoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCk7CisgICAgYmluZGVyOjpTdGF0dXMgdW5sb2NrVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjcmV0KTsKICAgICBiaW5kZXI6OlN0YXR1cyBsb2NrVXNlcktleShpbnQzMl90IHVzZXJJZCk7CiAKLSAgICBiaW5kZXI6OlN0YXR1cyBwcmVwYXJlVXNlclN0b3JhZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiYgdXVpZCwKLSAgICAgICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsIGludDMyX3QgZmxhZ3MpOwotICAgIGJpbmRlcjo6U3RhdHVzIGRlc3Ryb3lVc2VyU3RvcmFnZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+JiB1dWlkLAotICAgICAgICAgICAgaW50MzJfdCB1c2VySWQsIGludDMyX3QgZmxhZ3MpOworICAgIGJpbmRlcjo6U3RhdHVzIHByZXBhcmVVc2VyU3RvcmFnZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+JiB1dWlkLCBpbnQzMl90IHVzZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB1c2VyU2VyaWFsLCBpbnQzMl90IGZsYWdzKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBkZXN0cm95VXNlclN0b3JhZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiYgdXVpZCwgaW50MzJfdCB1c2VySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKZGlmZiAtLWdpdCBhL1ZvbGRVdGlsLmNwcCBiL1ZvbGRVdGlsLmNwcAppbmRleCBhZmU4YjUzLi4yNmM4MTdjIDEwMDY0NAotLS0gYS9Wb2xkVXRpbC5jcHAKKysrIGIvVm9sZFV0aWwuY3BwCkBAIC0xNCwxMyArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogCi1zdHJ1Y3QgZnN0YWIgKmZzdGFiX2RlZmF1bHQ7CitzdHJ1Y3QgZnN0YWIqIGZzdGFiX2RlZmF1bHQ7CiAKIHZvaWQgZ2V0X2Jsa2Rldl9zaXplKGludCBmZCwgdW5zaWduZWQgbG9uZyogbnJfc2VjKSB7Ci0gIGlmICgoaW9jdGwoZmQsIEJMS0dFVFNJWkUsIG5yX3NlYykpID09IC0xKSB7Ci0gICAgKm5yX3NlYyA9IDA7Ci0gIH0KKyAgICBpZiAoKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCBucl9zZWMpKSA9PSAtMSkgeworICAgICAgICAqbnJfc2VjID0gMDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9Wb2xkVXRpbC5oIGIvVm9sZFV0aWwuaAppbmRleCBmZDY2NjcyLi40MzExNTg2IDEwMDY0NAotLS0gYS9Wb2xkVXRpbC5oCisrKyBiL1ZvbGRVdGlsLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxmc3RhYi9mc3RhYi5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCi1leHRlcm4gc3RydWN0IGZzdGFiICpmc3RhYl9kZWZhdWx0OworZXh0ZXJuIHN0cnVjdCBmc3RhYiogZnN0YWJfZGVmYXVsdDsKIAogI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKihhKSkpCiAKZGlmZiAtLWdpdCBhL1ZvbHVtZU1hbmFnZXIuY3BwIGIvVm9sdW1lTWFuYWdlci5jcHAKaW5kZXggMjFlMTMyYS4uZjBiNzQyZSAxMDA2NDQKLS0tIGEvVm9sdW1lTWFuYWdlci5jcHAKKysrIGIvVm9sdW1lTWFuYWdlci5jcHAKQEAgLTI2LDggKzI2LDggQEAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCkBAIC03OSwxMSArNzksMTAgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga01ham9yQmxvY2tFeHBlcmltZW50YWxNaW4gPSAyNDA7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4ID0gMjU0OwogCi1Wb2x1bWVNYW5hZ2VyICpWb2x1bWVNYW5hZ2VyOjpzSW5zdGFuY2UgPSBOVUxMOworVm9sdW1lTWFuYWdlciogVm9sdW1lTWFuYWdlcjo6c0luc3RhbmNlID0gTlVMTDsKIAotVm9sdW1lTWFuYWdlciAqVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKSB7Ci0gICAgaWYgKCFzSW5zdGFuY2UpCi0gICAgICAgIHNJbnN0YW5jZSA9IG5ldyBWb2x1bWVNYW5hZ2VyKCk7CitWb2x1bWVNYW5hZ2VyKiBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpIHsKKyAgICBpZiAoIXNJbnN0YW5jZSkgc0luc3RhbmNlID0gbmV3IFZvbHVtZU1hbmFnZXIoKTsKICAgICByZXR1cm4gc0luc3RhbmNlOwogfQogCkBAIC05NSw4ICs5NCw3IEBACiAgICAgbVNlY3VyZUtleWd1YXJkU2hvd2luZyA9IHRydWU7CiB9CiAKLVZvbHVtZU1hbmFnZXI6On5Wb2x1bWVNYW5hZ2VyKCkgewotfQorVm9sdW1lTWFuYWdlcjo6flZvbHVtZU1hbmFnZXIoKSB7fQogCiBpbnQgVm9sdW1lTWFuYWdlcjo6dXBkYXRlVmlydHVhbERpc2soKSB7CiAgICAgQVRSQUNFX05BTUUoIlZvbHVtZU1hbmFnZXI6OnVwZGF0ZVZpcnR1YWxEaXNrIik7CkBAIC0xMTcsOCArMTE1LDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGF1dG8gZGlzayA9IG5ldyBhbmRyb2lkOjp2b2xkOjpEaXNrKCJ2aXJ0dWFsIiwgYnVmLnN0X3JkZXYsICJ2aXJ0dWFsIiwKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtBZG9wdGFibGUgfCBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a1NkKTsKKyAgICAgICAgICAgIGF1dG8gZGlzayA9IG5ldyBhbmRyb2lkOjp2b2xkOjpEaXNrKAorICAgICAgICAgICAgICAgICJ2aXJ0dWFsIiwgYnVmLnN0X3JkZXYsICJ2aXJ0dWFsIiwKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a0Fkb3B0YWJsZSB8IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprU2QpOwogICAgICAgICAgICAgbVZpcnR1YWxEaXNrID0gc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OkRpc2s+KGRpc2spOwogICAgICAgICAgICAgaGFuZGxlRGlza0FkZGVkKG1WaXJ0dWFsRGlzayk7CiAgICAgICAgIH0KQEAgLTE1Nyw3ICsxNTYsNyBAQAogICAgIC8vIHN0b3JhZ2U7IHRoZSBmcmFtZXdvcmsgd2lsbCBkZWNpZGUgaWYgaXQgc2hvdWxkIGJlIG1vdW50ZWQuCiAgICAgQ0hFQ0sobUludGVybmFsRW11bGF0ZWQgPT0gbnVsbHB0cik7CiAgICAgbUludGVybmFsRW11bGF0ZWQgPSBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6dm9sZDo6Vm9sdW1lQmFzZT4oCi0gICAgICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6RW11bGF0ZWRWb2x1bWUoIi9kYXRhL21lZGlhIikpOworICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6RW11bGF0ZWRWb2x1bWUoIi9kYXRhL21lZGlhIikpOwogICAgIG1JbnRlcm5hbEVtdWxhdGVkLT5jcmVhdGUoKTsKIAogICAgIC8vIENvbnNpZGVyIGNyZWF0aW5nIGEgdmlydHVhbCBkaXNrCkBAIC0xNzMsMTcgKzE3MiwxNyBAQAogICAgIHJldHVybiAwOwogfQogCi12b2lkIFZvbHVtZU1hbmFnZXI6OmhhbmRsZUJsb2NrRXZlbnQoTmV0bGlua0V2ZW50ICpldnQpIHsKK3ZvaWQgVm9sdW1lTWFuYWdlcjo6aGFuZGxlQmxvY2tFdmVudChOZXRsaW5rRXZlbnQqIGV2dCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtRGVidWcpIHsKICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICItLS0tLS0tLS0tLS0tLS0tIjsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJoYW5kbGVCbG9ja0V2ZW50IHdpdGggYWN0aW9uICIgPDwgKGludCkgZXZ0LT5nZXRBY3Rpb24oKTsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJoYW5kbGVCbG9ja0V2ZW50IHdpdGggYWN0aW9uICIgPDwgKGludClldnQtPmdldEFjdGlvbigpOwogICAgICAgICBldnQtPmR1bXAoKTsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBldmVudFBhdGgoZXZ0LT5maW5kUGFyYW0oIkRFVlBBVEgiKT9ldnQtPmZpbmRQYXJhbSgiREVWUEFUSCIpOiIiKTsKLSAgICBzdGQ6OnN0cmluZyBkZXZUeXBlKGV2dC0+ZmluZFBhcmFtKCJERVZUWVBFIik/ZXZ0LT5maW5kUGFyYW0oIkRFVlRZUEUiKToiIik7CisgICAgc3RkOjpzdHJpbmcgZXZlbnRQYXRoKGV2dC0+ZmluZFBhcmFtKCJERVZQQVRIIikgPyBldnQtPmZpbmRQYXJhbSgiREVWUEFUSCIpIDogIiIpOworICAgIHN0ZDo6c3RyaW5nIGRldlR5cGUoZXZ0LT5maW5kUGFyYW0oIkRFVlRZUEUiKSA/IGV2dC0+ZmluZFBhcmFtKCJERVZUWVBFIikgOiAiIik7CiAKICAgICBpZiAoZGV2VHlwZSAhPSAiZGlzayIpIHJldHVybjsKIApAQCAtMTkyLDQzICsxOTEsNDIgQEAKICAgICBkZXZfdCBkZXZpY2UgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CiAKICAgICBzd2l0Y2ggKGV2dC0+Z2V0QWN0aW9uKCkpIHsKLSAgICBjYXNlIE5ldGxpbmtFdmVudDo6QWN0aW9uOjprQWRkOiB7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgc291cmNlIDogbURpc2tTb3VyY2VzKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlLT5tYXRjaGVzKGV2ZW50UGF0aCkpIHsKLSAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCBhc3N1bWUgdGhhdCBNTUMgYW5kIHZpcnRpby1ibGsgKHRoZSBsYXR0ZXIgaXMKLSAgICAgICAgICAgICAgICAvLyBlbXVsYXRvci1zcGVjaWZpYzsgc2VlIERpc2suY3BwIGZvciBkZXRhaWxzKSBkZXZpY2VzIGFyZSBTRCwKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhhdCBldmVyeXRoaW5nIGVsc2UgaXMgVVNCCi0gICAgICAgICAgICAgICAgaW50IGZsYWdzID0gc291cmNlLT5nZXRGbGFncygpOwotICAgICAgICAgICAgICAgIGlmIChtYWpvciA9PSBrTWFqb3JCbG9ja01tYwotICAgICAgICAgICAgICAgICAgICB8fCAoYW5kcm9pZDo6dm9sZDo6SXNSdW5uaW5nSW5FbXVsYXRvcigpCi0gICAgICAgICAgICAgICAgICAgICYmIG1ham9yID49IChpbnQpIGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluCi0gICAgICAgICAgICAgICAgICAgICYmIG1ham9yIDw9IChpbnQpIGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4KSkgewotICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a1NkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprVXNiOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBOZXRsaW5rRXZlbnQ6OkFjdGlvbjo6a0FkZDogeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzb3VyY2UgOiBtRGlza1NvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlLT5tYXRjaGVzKGV2ZW50UGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgYXNzdW1lIHRoYXQgTU1DIGFuZCB2aXJ0aW8tYmxrICh0aGUgbGF0dGVyIGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGVtdWxhdG9yLXNwZWNpZmljOyBzZWUgRGlzay5jcHAgZm9yIGRldGFpbHMpIGRldmljZXMgYXJlIFNELAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhhdCBldmVyeXRoaW5nIGVsc2UgaXMgVVNCCisgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyA9IHNvdXJjZS0+Z2V0RmxhZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ham9yID09IGtNYWpvckJsb2NrTW1jIHx8IChhbmRyb2lkOjp2b2xkOjpJc1J1bm5pbmdJbkVtdWxhdG9yKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWpvciA+PSAoaW50KWtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFqb3IgPD0gKGludClrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1heCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprU2Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a1VzYjsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYXV0byBkaXNrID0gbmV3IGFuZHJvaWQ6OnZvbGQ6OkRpc2soZXZlbnRQYXRoLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPmdldE5pY2tuYW1lKCksIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVEaXNrQWRkZWQoc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OkRpc2s+KGRpc2spKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBkaXNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBhbmRyb2lkOjp2b2xkOjpEaXNrKGV2ZW50UGF0aCwgZGV2aWNlLCBzb3VyY2UtPmdldE5pY2tuYW1lKCksIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlza0FkZGVkKHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpEaXNrPihkaXNrKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE5ldGxpbmtFdmVudDo6QWN0aW9uOjprQ2hhbmdlOiB7Ci0gICAgICAgIExPRyhERUJVRykgPDwgIkRpc2sgYXQgIiA8PCBtYWpvciA8PCAiOiIgPDwgbWlub3IgPDwgIiBjaGFuZ2VkIjsKLSAgICAgICAgaGFuZGxlRGlza0NoYW5nZWQoZGV2aWNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTmV0bGlua0V2ZW50OjpBY3Rpb246OmtSZW1vdmU6IHsKLSAgICAgICAgaGFuZGxlRGlza1JlbW92ZWQoZGV2aWNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbmV4cGVjdGVkIGJsb2NrIGV2ZW50IGFjdGlvbiAiIDw8IChpbnQpIGV2dC0+Z2V0QWN0aW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKyAgICAgICAgY2FzZSBOZXRsaW5rRXZlbnQ6OkFjdGlvbjo6a0NoYW5nZTogeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiRGlzayBhdCAiIDw8IG1ham9yIDw8ICI6IiA8PCBtaW5vciA8PCAiIGNoYW5nZWQiOworICAgICAgICAgICAgaGFuZGxlRGlza0NoYW5nZWQoZGV2aWNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTmV0bGlua0V2ZW50OjpBY3Rpb246OmtSZW1vdmU6IHsKKyAgICAgICAgICAgIGhhbmRsZURpc2tSZW1vdmVkKGRldmljZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlVuZXhwZWN0ZWQgYmxvY2sgZXZlbnQgYWN0aW9uICIgPDwgKGludClldnQtPmdldEFjdGlvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTIzNyw3ICsyMzUsNyBAQAogICAgIC8vIHVudGlsIHRoZSB1c2VyIHVubG9ja3MgdGhlIGRldmljZSB0byBhY3R1YWxseSB0b3VjaCBpdAogICAgIGlmIChtU2VjdXJlS2V5Z3VhcmRTaG93aW5nKSB7CiAgICAgICAgIExPRyhJTkZPKSA8PCAiRm91bmQgZGlzayBhdCAiIDw8IGRpc2stPmdldEV2ZW50UGF0aCgpCi0gICAgICAgICAgICAgICAgPDwgIiBidXQgZGVsYXlpbmcgc2NhbiBkdWUgdG8gc2VjdXJlIGtleWd1YXJkIjsKKyAgICAgICAgICAgICAgICAgIDw8ICIgYnV0IGRlbGF5aW5nIHNjYW4gZHVlIHRvIHNlY3VyZSBrZXlndWFyZCI7CiAgICAgICAgIG1QZW5kaW5nRGlza3MucHVzaF9iYWNrKGRpc2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRpc2stPmNyZWF0ZSgpOwpAQCAtMzEyLDggKzMxMCw3IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXZvaWQgVm9sdW1lTWFuYWdlcjo6bGlzdFZvbHVtZXMoYW5kcm9pZDo6dm9sZDo6Vm9sdW1lQmFzZTo6VHlwZSB0eXBlLAotICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBsaXN0KSB7Cit2b2lkIFZvbHVtZU1hbmFnZXI6Omxpc3RWb2x1bWVzKGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U6OlR5cGUgdHlwZSwgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiYgbGlzdCkgewogICAgIGxpc3QuY2xlYXIoKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRpc2sgOiBtRGlza3MpIHsKICAgICAgICAgZGlzay0+bGlzdFZvbHVtZXModHlwZSwgbGlzdCk7CkBAIC00OTcsNyArNDk0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFdlIHB1cnBvc2VmdWxseSBsZWF2ZSB0aGUgbmFtZXNwYWNlIG9wZW4gYWNyb3NzIHRoZSBmb3JrCi0gICAgICAgIG5zRmQgPSBvcGVuYXQocGlkRmQsICJucy9tbnQiLCBPX1JET05MWSk7IC8vIG5vdCBPX0NMT0VYRUMKKyAgICAgICAgbnNGZCA9IG9wZW5hdChwaWRGZCwgIm5zL21udCIsIE9fUkRPTkxZKTsgIC8vIG5vdCBPX0NMT0VYRUMKICAgICAgICAgaWYgKG5zRmQgPCAwKSB7CiAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gb3BlbiBuYW1lc3BhY2UgZm9yICIgPDwgZGUtPmRfbmFtZTsKICAgICAgICAgICAgIGdvdG8gbmV4dDsKQEAgLTUyMiwyNiArNTE5LDIyIEBACiAgICAgICAgICAgICAgICAgLy8gU2FuZSBkZWZhdWx0IG9mIG5vIHN0b3JhZ2UgdmlzaWJsZQogICAgICAgICAgICAgICAgIF9leGl0KDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudChzdG9yYWdlU291cmNlLmNfc3RyKCksICIvc3RvcmFnZSIsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsIE1TX0JJTkQgfCBNU19SRUMsIE5VTEwpKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbW91bnQgIiA8PCBzdG9yYWdlU291cmNlIDw8ICIgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGRlLT5kX25hbWU7CisgICAgICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKAorICAgICAgICAgICAgICAgICAgICBtb3VudChzdG9yYWdlU291cmNlLmNfc3RyKCksICIvc3RvcmFnZSIsIE5VTEwsIE1TX0JJTkQgfCBNU19SRUMsIE5VTEwpKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbW91bnQgIiA8PCBzdG9yYWdlU291cmNlIDw8ICIgZm9yICIgPDwgZGUtPmRfbmFtZTsKICAgICAgICAgICAgICAgICBfZXhpdCgxKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkobW91bnQoTlVMTCwgIi9zdG9yYWdlIiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTVNfUkVDIHwgTVNfU0xBVkUsIE5VTEwpKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IE1TX1NMQVZFIHRvIC9zdG9yYWdlIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBkZS0+ZF9uYW1lOworICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudChOVUxMLCAiL3N0b3JhZ2UiLCBOVUxMLCBNU19SRUMgfCBNU19TTEFWRSwgTlVMTCkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgTVNfU0xBVkUgdG8gL3N0b3JhZ2UgZm9yICIgPDwgZGUtPmRfbmFtZTsKICAgICAgICAgICAgICAgICBfZXhpdCgxKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTW91bnQgdXNlci1zcGVjaWZpYyBzeW1saW5rIGhlbHBlciBpbnRvIHBsYWNlCiAgICAgICAgICAgICB1c2VyaWRfdCB1c2VyX2lkID0gbXVsdGl1c2VyX2dldF91c2VyX2lkKHVpZCk7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyB1c2VyU291cmNlKFN0cmluZ1ByaW50ZigiL21udC91c2VyLyVkIiwgdXNlcl9pZCkpOwotICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudCh1c2VyU291cmNlLmNfc3RyKCksICIvc3RvcmFnZS9zZWxmIiwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgTVNfQklORCwgTlVMTCkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtb3VudCAiIDw8IHVzZXJTb3VyY2UgPDwgIiBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGUtPmRfbmFtZTsKKyAgICAgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkoCisgICAgICAgICAgICAgICAgICAgIG1vdW50KHVzZXJTb3VyY2UuY19zdHIoKSwgIi9zdG9yYWdlL3NlbGYiLCBOVUxMLCBNU19CSU5ELCBOVUxMKSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG1vdW50ICIgPDwgdXNlclNvdXJjZSA8PCAiIGZvciAiIDw8IGRlLT5kX25hbWU7CiAgICAgICAgICAgICAgICAgX2V4aXQoMSk7CiAgICAgICAgICAgICB9CiAKQEAgLTU1NSw3ICs1NDgsNyBAQAogICAgICAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQoY2hpbGQsIG51bGxwdHIsIDApKTsKICAgICAgICAgfQogCi1uZXh0OgorICAgIG5leHQ6CiAgICAgICAgIGNsb3NlKG5zRmQpOwogICAgICAgICBjbG9zZShwaWRGZCk7CiAgICAgfQpAQCAtNTgzLDcgKzU3Niw3IEBACiAvLyBDYW4gYmUgY2FsbGVkIHR3aWNlIChzZXF1ZW50aWFsbHkpIGR1cmluZyBzaHV0ZG93bi4gc2hvdWxkIGJlIHNhZmUgZm9yIHRoYXQuCiBpbnQgVm9sdW1lTWFuYWdlcjo6c2h1dGRvd24oKSB7CiAgICAgaWYgKG1JbnRlcm5hbEVtdWxhdGVkID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIDA7IC8vIGFscmVhZHkgc2h1dGRvd24KKyAgICAgICAgcmV0dXJuIDA7ICAvLyBhbHJlYWR5IHNodXRkb3duCiAgICAgfQogICAgIGFuZHJvaWQ6OnZvbGQ6OnNTbGVlcE9uVW5tb3VudCA9IGZhbHNlOwogICAgIG1JbnRlcm5hbEVtdWxhdGVkLT5kZXN0cm95KCk7CkBAIC02NzMsMjAgKzY2NiwxOCBAQAogICAgIGFuZHJvaWQ6OnZvbGQ6OkZvcmNlVW5tb3VudChwYXRoKTsKIAogICAgIGNvbnN0IGF1dG8gb3B0cyA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICJmZD0laSwiCi0gICAgICAgICAgICAicm9vdG1vZGU9NDAwMDAsIgotICAgICAgICAgICAgImRlZmF1bHRfcGVybWlzc2lvbnMsIgotICAgICAgICAgICAgImFsbG93X290aGVyLCIKLSAgICAgICAgICAgICJ1c2VyX2lkPSVkLGdyb3VwX2lkPSVkLCIKLSAgICAgICAgICAgICJjb250ZXh0PVwidTpvYmplY3RfcjphcHBfZnVzZV9maWxlOnMwXCIsIgotICAgICAgICAgICAgImZzY29udGV4dD11Om9iamVjdF9yOmFwcF9mdXNlZnM6czAiLAotICAgICAgICAgICAgZGV2aWNlX2ZkLAotICAgICAgICAgICAgdWlkLAotICAgICAgICAgICAgdWlkKTsKKyAgICAgICAgImZkPSVpLCIKKyAgICAgICAgInJvb3Rtb2RlPTQwMDAwLCIKKyAgICAgICAgImRlZmF1bHRfcGVybWlzc2lvbnMsIgorICAgICAgICAiYWxsb3dfb3RoZXIsIgorICAgICAgICAidXNlcl9pZD0lZCxncm91cF9pZD0lZCwiCisgICAgICAgICJjb250ZXh0PVwidTpvYmplY3RfcjphcHBfZnVzZV9maWxlOnMwXCIsIgorICAgICAgICAiZnNjb250ZXh0PXU6b2JqZWN0X3I6YXBwX2Z1c2VmczpzMCIsCisgICAgICAgIGRldmljZV9mZCwgdWlkLCB1aWQpOwogCi0gICAgY29uc3QgaW50IHJlc3VsdCA9IFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudCgKLSAgICAgICAgICAgICIvZGV2L2Z1c2UiLCBwYXRoLmNfc3RyKCksICJmdXNlIiwKLSAgICAgICAgICAgIE1TX05PU1VJRCB8IE1TX05PREVWIHwgTVNfTk9FWEVDIHwgTVNfTk9BVElNRSwgb3B0cy5jX3N0cigpKSk7CisgICAgY29uc3QgaW50IHJlc3VsdCA9CisgICAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudCgiL2Rldi9mdXNlIiwgcGF0aC5jX3N0cigpLCAiZnVzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU19OT1NVSUQgfCBNU19OT0RFViB8IE1TX05PRVhFQyB8IE1TX05PQVRJTUUsIG9wdHMuY19zdHIoKSkpOwogICAgIGlmIChyZXN1bHQgIT0gMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG1vdW50ICIgPDwgcGF0aDsKICAgICAgICAgcmV0dXJuIC1lcnJubzsKQEAgLTY5NSwxMSArNjg2LDggQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLXN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBydW5Db21tYW5kSW5OYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV9mZCkgeworc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IHJ1bkNvbW1hbmRJbk5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCwgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBpbnQgZGV2aWNlX2ZkKSB7CiAgICAgaWYgKERFQlVHX0FQUEZVU0UpIHsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiUnVuIGFwcCBmdXNlIGNvbW1hbmQgIiA8PCBjb21tYW5kIDw8ICIgZm9yIHRoZSBwYXRoICIgPDwgcGF0aAogICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gbmFtZXNwYWNlICIgPDwgdWlkOwpAQCAtNzEzLDggKzcwMSw3IEBACiAKICAgICAvLyBPYnRhaW5zIHByb2Nlc3MgZmlsZSBkZXNjcmlwdG9yLgogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBpZF9zdHIgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIiVkIiwgcGlkKTsKLSAgICBjb25zdCB1bmlxdWVfZmQgcGlkX2ZkKAotICAgICAgICAgICAgb3BlbmF0KGRpci5nZXQoKSwgcGlkX3N0ci5jX3N0cigpLCBPX1JET05MWSB8IE9fRElSRUNUT1JZIHwgT19DTE9FWEVDKSk7CisgICAgY29uc3QgdW5pcXVlX2ZkIHBpZF9mZChvcGVuYXQoZGlyLmdldCgpLCBwaWRfc3RyLmNfc3RyKCksIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkgfCBPX0NMT0VYRUMpKTsKICAgICBpZiAocGlkX2ZkLmdldCgpID09IC0xKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAvcHJvYy8iIDw8IHBpZDsKICAgICAgICAgcmV0dXJuIC1lcnJubzsKQEAgLTczMCw3ICs3MTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChzYi5zdF91aWQgIT0gQUlEX1NZU1RFTSkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiT25seSBzeXN0ZW0gY2FuIG1vdW50IGFwcGZ1c2UuIFVJRCBleHBlY3RlZD0iIDw8IEFJRF9TWVNURU0KLSAgICAgICAgICAgICAgICAgICAgPDwgIiwgYWN0dWFsPSIgPDwgc2Iuc3RfdWlkOworICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBhY3R1YWw9IiA8PCBzYi5zdF91aWQ7CiAgICAgICAgICAgICByZXR1cm4gLUVQRVJNOwogICAgICAgICB9CiAgICAgfQpAQCAtNzM5LDggKzcyNiw4IEBACiAgICAgewogICAgICAgICBzdGQ6OnN0cmluZyByb290TmFtZTsKICAgICAgICAgc3RkOjpzdHJpbmcgcGlkTmFtZTsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjp2b2xkOjpSZWFkbGlua2F0KGRpci5nZXQoKSwgIjEvbnMvbW50IiwgJnJvb3ROYW1lKQotICAgICAgICAgICAgICAgIHx8ICFhbmRyb2lkOjp2b2xkOjpSZWFkbGlua2F0KHBpZF9mZC5nZXQoKSwgIm5zL21udCIsICZwaWROYW1lKSkgeworICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OlJlYWRsaW5rYXQoZGlyLmdldCgpLCAiMS9ucy9tbnQiLCAmcm9vdE5hbWUpIHx8CisgICAgICAgICAgICAhYW5kcm9pZDo6dm9sZDo6UmVhZGxpbmthdChwaWRfZmQuZ2V0KCksICJucy9tbnQiLCAmcGlkTmFtZSkpIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBuYW1lc3BhY2VzIjsKICAgICAgICAgICAgIHJldHVybiAtRVBFUk07CiAgICAgICAgIH0KQEAgLTc1MSw3ICs3MzgsNyBAQAogICAgIH0KIAogICAgIC8vIFdlIHB1cnBvc2VmdWxseSBsZWF2ZSB0aGUgbmFtZXNwYWNlIG9wZW4gYWNyb3NzIHRoZSBmb3JrCi0gICAgdW5pcXVlX2ZkIG5zX2ZkKG9wZW5hdChwaWRfZmQuZ2V0KCksICJucy9tbnQiLCBPX1JET05MWSkpOyAvLyBub3QgT19DTE9FWEVDCisgICAgdW5pcXVlX2ZkIG5zX2ZkKG9wZW5hdChwaWRfZmQuZ2V0KCksICJucy9tbnQiLCBPX1JET05MWSkpOyAgLy8gbm90IE9fQ0xPRVhFQwogICAgIGlmIChuc19mZC5nZXQoKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIG5hbWVzcGFjZSBmb3IgL3Byb2MvIiA8PCBwaWQgPDwgIi9ucy9tbnQiOwogICAgICAgICByZXR1cm4gLWVycm5vOwpAQCAtNzY5LDggKzc1Niw4IEBACiAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAidW5tb3VudCIpIHsKICAgICAgICAgICAgIC8vIElmIGl0J3MganVzdCBhZnRlciBhbGwgRkQgb3BlbmVkIG9uIG1vdW50IHBvaW50IGFyZSBjbG9zZWQsIHVtb3VudDIgY2FuIGZhaWwgd2l0aAogICAgICAgICAgICAgLy8gRUJVU1kuIFRvIGF2b2lkIHRoZSBjYXNlLCBzcGVjaWZ5IE1OVF9ERVRBQ0guCi0gICAgICAgICAgICBpZiAodW1vdW50MihwYXRoLmNfc3RyKCksIFVNT1VOVF9OT0ZPTExPVyB8IE1OVF9ERVRBQ0gpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgZXJybm8gIT0gRUlOVkFMICYmIGVycm5vICE9IEVOT0VOVCkgeworICAgICAgICAgICAgaWYgKHVtb3VudDIocGF0aC5jX3N0cigpLCBVTU9VTlRfTk9GT0xMT1cgfCBNTlRfREVUQUNIKSAhPSAwICYmIGVycm5vICE9IEVJTlZBTCAmJgorICAgICAgICAgICAgICAgIGVycm5vICE9IEVOT0VOVCkgewogICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdW5tb3VudCBkaXJlY3RvcnkuIjsKICAgICAgICAgICAgICAgICBfZXhpdCgtZXJybm8pOwogICAgICAgICAgICAgfQpAQCAtNzk3LDExICs3ODQsMTEgQEAKIH0KIAogaW50IFZvbHVtZU1hbmFnZXI6OmNyZWF0ZU9iYihjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZUtleSwKLSAgICAgICAgaW50MzJfdCBvd25lckdpZCwgc3RkOjpzdHJpbmcqIG91dFZvbElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3duZXJHaWQsIHN0ZDo6c3RyaW5nKiBvdXRWb2xJZCkgewogICAgIGludCBpZCA9IG1OZXh0T2JiSWQrKzsKIAogICAgIGF1dG8gdm9sID0gc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U+KAotICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OnZvbGQ6Ok9iYlZvbHVtZShpZCwgc291cmNlUGF0aCwgc291cmNlS2V5LCBvd25lckdpZCkpOworICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6T2JiVm9sdW1lKGlkLCBzb3VyY2VQYXRoLCBzb3VyY2VLZXksIG93bmVyR2lkKSk7CiAgICAgdm9sLT5jcmVhdGUoKTsKIAogICAgIG1PYmJWb2x1bWVzLnB1c2hfYmFjayh2b2wpOwpAQCAtODIzLDcgKzgxMCw3IEBACiB9CiAKIGludCBWb2x1bWVNYW5hZ2VyOjptb3VudEFwcEZ1c2UodWlkX3QgdWlkLCBwaWRfdCBwaWQsIGludCBtb3VudElkLAotICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCkgewogICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBzdGQ6OnRvX3N0cmluZyhtb3VudElkKTsKIAogICAgIC8vIENoZWNrIG1vdW50IHBvaW50IG5hbWUuCkBAIC04NDEsNyArODI4LDcgQEAKICAgICB9CiAKICAgICAvLyBPcGVuIGRldmljZSBGRC4KLSAgICBkZXZpY2VfZmQtPnJlc2V0KG9wZW4oIi9kZXYvZnVzZSIsIE9fUkRXUikpOyAvLyBub3QgT19DTE9FWEVDCisgICAgZGV2aWNlX2ZkLT5yZXNldChvcGVuKCIvZGV2L2Z1c2UiLCBPX1JEV1IpKTsgIC8vIG5vdCBPX0NMT0VYRUMKICAgICBpZiAoZGV2aWNlX2ZkLT5nZXQoKSA9PSAtMSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gL2Rldi9mdXNlIjsKICAgICAgICAgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvVm9sdW1lTWFuYWdlci5oIGIvVm9sdW1lTWFuYWdlci5oCmluZGV4IGZiNDU1ZDguLmVlZGIxY2IgMTAwNjQ0Ci0tLSBhL1ZvbHVtZU1hbmFnZXIuaAorKysgYi9Wb2x1bWVNYW5hZ2VyLmgKQEAgLTE3LDggKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9WT0xEX1ZPTFVNRV9NQU5BR0VSX0gKICNkZWZpbmUgQU5EUk9JRF9WT0xEX1ZPTFVNRV9NQU5BR0VSX0gKIAotI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaW5jbHVkZSA8bGlzdD4KQEAgLTI5LDkgKzI5LDkgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CisjaW5jbHVkZSA8c3lzdXRpbHMvTmV0bGlua0V2ZW50Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPHN5c3V0aWxzL05ldGxpbmtFdmVudC5oPgogCiAjaW5jbHVkZSAiYW5kcm9pZC9vcy9JVm9sZExpc3RlbmVyLmgiCiAKQEAgLTQxLDEyICs0MSwxMiBAQAogI2RlZmluZSBERUJVR19BUFBGVVNFIDAKIAogY2xhc3MgVm9sdW1lTWFuYWdlciB7Ci1wcml2YXRlOgotICAgIHN0YXRpYyBWb2x1bWVNYW5hZ2VyICpzSW5zdGFuY2U7CisgIHByaXZhdGU6CisgICAgc3RhdGljIFZvbHVtZU1hbmFnZXIqIHNJbnN0YW5jZTsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgbURlYnVnOworICAgIGJvb2wgbURlYnVnOwogCi1wdWJsaWM6CisgIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5Wb2x1bWVNYW5hZ2VyKCk7CiAKICAgICAvLyBUT0RPOiBwaXBlIGFsbCByZXF1ZXN0cyB0aHJvdWdoIFZNIHRvIGF2b2lkIGV4cG9zaW5nIHRoaXMgbG9jawpAQCAtNTksMTMgKzU5LDEyIEBACiAgICAgaW50IHN0YXJ0KCk7CiAgICAgaW50IHN0b3AoKTsKIAotICAgIHZvaWQgaGFuZGxlQmxvY2tFdmVudChOZXRsaW5rRXZlbnQgKmV2dCk7CisgICAgdm9pZCBoYW5kbGVCbG9ja0V2ZW50KE5ldGxpbmtFdmVudCogZXZ0KTsKIAogICAgIGNsYXNzIERpc2tTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgRGlza1NvdXJjZShjb25zdCBzdGQ6OnN0cmluZyYgc3lzUGF0dGVybiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5pY2tuYW1lLCBpbnQgZmxhZ3MpIDoKLSAgICAgICAgICAgICAgICBtU3lzUGF0dGVybihzeXNQYXR0ZXJuKSwgbU5pY2tuYW1lKG5pY2tuYW1lKSwgbUZsYWdzKGZsYWdzKSB7Ci0gICAgICAgIH0KKyAgICAgIHB1YmxpYzoKKyAgICAgICAgRGlza1NvdXJjZShjb25zdCBzdGQ6OnN0cmluZyYgc3lzUGF0dGVybiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5pY2tuYW1lLCBpbnQgZmxhZ3MpCisgICAgICAgICAgICA6IG1TeXNQYXR0ZXJuKHN5c1BhdHRlcm4pLCBtTmlja25hbWUobmlja25hbWUpLCBtRmxhZ3MoZmxhZ3MpIHt9CiAKICAgICAgICAgYm9vbCBtYXRjaGVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzeXNQYXRoKSB7CiAgICAgICAgICAgICByZXR1cm4gIWZubWF0Y2gobVN5c1BhdHRlcm4uY19zdHIoKSwgc3lzUGF0aC5jX3N0cigpLCAwKTsKQEAgLTc0LDcgKzczLDcgQEAKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldE5pY2tuYW1lKCkgeyByZXR1cm4gbU5pY2tuYW1lOyB9CiAgICAgICAgIGludCBnZXRGbGFncygpIHsgcmV0dXJuIG1GbGFnczsgfQogCi0gICAgcHJpdmF0ZToKKyAgICAgIHByaXZhdGU6CiAgICAgICAgIHN0ZDo6c3RyaW5nIG1TeXNQYXR0ZXJuOwogICAgICAgICBzdGQ6OnN0cmluZyBtTmlja25hbWU7CiAgICAgICAgIGludCBtRmxhZ3M7CkBAIC0xMTAsNyArMTA5LDcgQEAKICAgICBpbnQgdXBkYXRlVmlydHVhbERpc2soKTsKICAgICBpbnQgc2V0RGVidWcoYm9vbCBlbmFibGUpOwogCi0gICAgc3RhdGljIFZvbHVtZU1hbmFnZXIgKkluc3RhbmNlKCk7CisgICAgc3RhdGljIFZvbHVtZU1hbmFnZXIqIEluc3RhbmNlKCk7CiAKICAgICAvKgogICAgICAqIEVuc3VyZSB0aGF0IGFsbCBkaXJlY3RvcmllcyBhbG9uZyBnaXZlbiBwYXRoIGV4aXN0LCBjcmVhdGluZyBwYXJlbnQKQEAgLTEyMiwxMyArMTIxLDEzIEBACiAgICAgaW50IG1rZGlycyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiAKICAgICBpbnQgY3JlYXRlT2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQzMl90IG93bmVyR2lkLAotICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dFZvbElkKTsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRWb2xJZCk7CiAgICAgaW50IGRlc3Ryb3lPYmIoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKTsKIAogICAgIGludCBtb3VudEFwcEZ1c2UodWlkX3QgdWlkLCBwaWRfdCBwaWQsIGludCBtb3VudElkLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCk7CiAgICAgaW50IHVubW91bnRBcHBGdXNlKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBpbnQgbW91bnRJZCk7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgVm9sdW1lTWFuYWdlcigpOwogICAgIHZvaWQgcmVhZEluaXRpYWxTdGF0ZSgpOwogCmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9vcy9JVm9sZC5haWRsIGIvYmluZGVyL2FuZHJvaWQvb3MvSVZvbGQuYWlkbAppbmRleCBmMzg2ODg5Li41NjczODVjIDEwMDY0NAotLS0gYS9iaW5kZXIvYW5kcm9pZC9vcy9JVm9sZC5haWRsCisrKyBiL2JpbmRlci9hbmRyb2lkL29zL0lWb2xkLmFpZGwKQEAgLTQ0LDE0ICs0NCwxNCBAQAogICAgIHZvaWQgY2hlY2tFbmNyeXB0aW9uKEB1dGY4SW5DcHAgU3RyaW5nIHZvbElkKTsKIAogICAgIHZvaWQgbW92ZVN0b3JhZ2UoQHV0ZjhJbkNwcCBTdHJpbmcgZnJvbVZvbElkLCBAdXRmOEluQ3BwIFN0cmluZyB0b1ZvbElkLAotICAgICAgICAgICAgSVZvbGRUYXNrTGlzdGVuZXIgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICAgSVZvbGRUYXNrTGlzdGVuZXIgbGlzdGVuZXIpOwogCiAgICAgdm9pZCByZW1vdW50VWlkKGludCB1aWQsIGludCByZW1vdW50TW9kZSk7CiAKICAgICB2b2lkIG1rZGlycyhAdXRmOEluQ3BwIFN0cmluZyBwYXRoKTsKIAotICAgIEB1dGY4SW5DcHAgU3RyaW5nIGNyZWF0ZU9iYihAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VQYXRoLAotICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgc291cmNlS2V5LCBpbnQgb3duZXJHaWQpOworICAgIEB1dGY4SW5DcHAgU3RyaW5nIGNyZWF0ZU9iYihAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VQYXRoLCBAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvd25lckdpZCk7CiAgICAgdm9pZCBkZXN0cm95T2JiKEB1dGY4SW5DcHAgU3RyaW5nIHZvbElkKTsKIAogICAgIHZvaWQgZnN0cmltKGludCBmc3RyaW1GbGFncywgSVZvbGRUYXNrTGlzdGVuZXIgbGlzdGVuZXIpOwpAQCAtODQsMTMgKzg0LDE2IEBACiAgICAgdm9pZCBjcmVhdGVVc2VyS2V5KGludCB1c2VySWQsIGludCB1c2VyU2VyaWFsLCBib29sZWFuIGVwaGVtZXJhbCk7CiAgICAgdm9pZCBkZXN0cm95VXNlcktleShpbnQgdXNlcklkKTsKIAotICAgIHZvaWQgYWRkVXNlcktleUF1dGgoaW50IHVzZXJJZCwgaW50IHVzZXJTZXJpYWwsIEB1dGY4SW5DcHAgU3RyaW5nIHRva2VuLCBAdXRmOEluQ3BwIFN0cmluZyBzZWNyZXQpOworICAgIHZvaWQgYWRkVXNlcktleUF1dGgoaW50IHVzZXJJZCwgaW50IHVzZXJTZXJpYWwsIEB1dGY4SW5DcHAgU3RyaW5nIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgc2VjcmV0KTsKICAgICB2b2lkIGZpeGF0ZU5ld2VzdFVzZXJLZXlBdXRoKGludCB1c2VySWQpOwogCi0gICAgdm9pZCB1bmxvY2tVc2VyS2V5KGludCB1c2VySWQsIGludCB1c2VyU2VyaWFsLCBAdXRmOEluQ3BwIFN0cmluZyB0b2tlbiwgQHV0ZjhJbkNwcCBTdHJpbmcgc2VjcmV0KTsKKyAgICB2b2lkIHVubG9ja1VzZXJLZXkoaW50IHVzZXJJZCwgaW50IHVzZXJTZXJpYWwsIEB1dGY4SW5DcHAgU3RyaW5nIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBzZWNyZXQpOwogICAgIHZvaWQgbG9ja1VzZXJLZXkoaW50IHVzZXJJZCk7CiAKLSAgICB2b2lkIHByZXBhcmVVc2VyU3RvcmFnZShAbnVsbGFibGUgQHV0ZjhJbkNwcCBTdHJpbmcgdXVpZCwgaW50IHVzZXJJZCwgaW50IHVzZXJTZXJpYWwsIGludCBzdG9yYWdlRmxhZ3MpOworICAgIHZvaWQgcHJlcGFyZVVzZXJTdG9yYWdlKEBudWxsYWJsZSBAdXRmOEluQ3BwIFN0cmluZyB1dWlkLCBpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcmFnZUZsYWdzKTsKICAgICB2b2lkIGRlc3Ryb3lVc2VyU3RvcmFnZShAbnVsbGFibGUgQHV0ZjhJbkNwcCBTdHJpbmcgdXVpZCwgaW50IHVzZXJJZCwgaW50IHN0b3JhZ2VGbGFncyk7CiAKICAgICBjb25zdCBpbnQgRU5DUllQVElPTl9GTEFHX05PX1VJID0gNDsKZGlmZiAtLWdpdCBhL2NyeXB0ZnMuY3BwIGIvY3J5cHRmcy5jcHAKaW5kZXggYzQyNzRlZC4uMDBlNTUxOSAxMDA2NDQKLS0tIGEvY3J5cHRmcy5jcHAKKysrIGIvY3J5cHRmcy5jcHAKQEAgLTgwLDE0ICs4MCwxMiBAQAogCiBjb25zdGV4cHIgc2l6ZV90IElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTID0gMTY7CiBjb25zdGV4cHIgc2l6ZV90IElOVEVSTUVESUFURV9JVl9MRU5fQllURVMgPSAxNjsKLWNvbnN0ZXhwciBzaXplX3QgSU5URVJNRURJQVRFX0JVRl9TSVpFID0KLSAgICAoSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMgKyBJTlRFUk1FRElBVEVfSVZfTEVOX0JZVEVTKTsKK2NvbnN0ZXhwciBzaXplX3QgSU5URVJNRURJQVRFX0JVRl9TSVpFID0gKElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTICsgSU5URVJNRURJQVRFX0lWX0xFTl9CWVRFUyk7CiAKIC8vIFNDUllQVF9MRU4gaXMgdXNlZCBieSBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBmb3IgaXRzIGludGVybWVkaWF0ZSBrZXkuCi1zdGF0aWNfYXNzZXJ0KElOVEVSTUVESUFURV9CVUZfU0laRSA9PSBTQ1JZUFRfTEVOLAotICAgICAgICAgICAgICAiTWlzbWF0Y2ggb2YgaW50ZXJtZWRpYXRlIGtleSBzaXplcyIpOworc3RhdGljX2Fzc2VydChJTlRFUk1FRElBVEVfQlVGX1NJWkUgPT0gU0NSWVBUX0xFTiwgIk1pc21hdGNoIG9mIGludGVybWVkaWF0ZSBrZXkgc2l6ZXMiKTsKIAotI2RlZmluZSBLRVlfSU5fRk9PVEVSICAiZm9vdGVyIgorI2RlZmluZSBLRVlfSU5fRk9PVEVSICJmb290ZXIiCiAKICNkZWZpbmUgREVGQVVMVF9QQVNTV09SRCAiZGVmYXVsdF9wYXNzd29yZCIKIApAQCAtMTEzLDI3ICsxMTEsMjUgQEAKIHN0YXRpYyBpbnQgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpOwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBzYXZlZF9tYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsKLXN0YXRpYyBjaGFyICpzYXZlZF9tb3VudF9wb2ludDsKLXN0YXRpYyBpbnQgIG1hc3Rlcl9rZXlfc2F2ZWQgPSAwOwotc3RhdGljIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEgKnBlcnNpc3RfZGF0YSA9IE5VTEw7CitzdGF0aWMgY2hhciogc2F2ZWRfbW91bnRfcG9pbnQ7CitzdGF0aWMgaW50IG1hc3Rlcl9rZXlfc2F2ZWQgPSAwOworc3RhdGljIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEqIHBlcnNpc3RfZGF0YSA9IE5VTEw7CiAKIC8qIFNob3VsZCB3ZSB1c2Uga2V5bWFzdGVyPyAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSgpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5KCkgewogICAgIHJldHVybiBrZXltYXN0ZXJfY29tcGF0aWJpbGl0eV9jcnlwdGZzX3NjcnlwdCgpOwogfQogCiAvKiBDcmVhdGUgYSBuZXcga2V5bWFzdGVyIGtleSBhbmQgc3RvcmUgaXQgaW4gdGhpcyBmb290ZXIgKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX2NyZWF0ZV9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0cikKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2NyZWF0ZV9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0cikgewogICAgIGlmIChmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUpIHsKICAgICAgICAgU0xPR0koIkFscmVhZHkgaGF2ZSBrZXkiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaW50IHJjID0ga2V5bWFzdGVyX2NyZWF0ZV9rZXlfZm9yX2NyeXB0ZnNfc2NyeXB0KFJTQV9LRVlfU0laRSwgUlNBX0VYUE9ORU5ULAotICAgICAgICAgICAgS0VZTUFTVEVSX0NSWVBURlNfUkFURV9MSU1JVCwgZnRyLT5rZXltYXN0ZXJfYmxvYiwgS0VZTUFTVEVSX0JMT0JfU0laRSwKLSAgICAgICAgICAgICZmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUpOworICAgIGludCByYyA9IGtleW1hc3Rlcl9jcmVhdGVfa2V5X2Zvcl9jcnlwdGZzX3NjcnlwdCgKKyAgICAgICAgUlNBX0tFWV9TSVpFLCBSU0FfRVhQT05FTlQsIEtFWU1BU1RFUl9DUllQVEZTX1JBVEVfTElNSVQsIGZ0ci0+a2V5bWFzdGVyX2Jsb2IsCisgICAgICAgIEtFWU1BU1RFUl9CTE9CX1NJWkUsICZmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUpOwogICAgIGlmIChyYykgewogICAgICAgICBpZiAoZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplID4gS0VZTUFTVEVSX0JMT0JfU0laRSkgewogICAgICAgICAgICAgU0xPR0UoIktleW1hc3RlciBrZXkgYmxvYiB0b28gbGFyZ2UiKTsKQEAgLTE0NiwxMiArMTQyLDkgQEAKIH0KIAogLyogVGhpcyBzaWducyB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIHRoZSBrZXltYXN0ZXIga2V5LiAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfc2lnbl9vYmplY3Qoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvYmplY3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnNpZ25hdHVyZV9zaXplKQoteworc3RhdGljIGludCBrZXltYXN0ZXJfc2lnbl9vYmplY3Qoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0ciwgY29uc3QgdW5zaWduZWQgY2hhciogb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9iamVjdF9zaXplLCB1bnNpZ25lZCBjaGFyKiogc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBzaWduYXR1cmVfc2l6ZSkgewogICAgIHVuc2lnbmVkIGNoYXIgdG9fc2lnbltSU0FfS0VZX1NJWkVfQllURVNdOwogICAgIHNpemVfdCB0b19zaWduX3NpemUgPSBzaXplb2YodG9fc2lnbik7CiAgICAgbWVtc2V0KHRvX3NpZ24sIDAsIFJTQV9LRVlfU0laRV9CWVRFUyk7CkBAIC0yMzAsMjEgKzIyMywyMCBAQAogc3RhdGljIGludCBwYXNzd29yZF9leHBpcnlfdGltZSA9IDA7CiBzdGF0aWMgY29uc3QgaW50IHBhc3N3b3JkX21heF9hZ2Vfc2Vjb25kcyA9IDYwOwogCi1lbnVtIGNsYXNzIFJlYm9vdFR5cGUge3JlYm9vdCwgcmVjb3ZlcnksIHNodXRkb3dufTsKLXN0YXRpYyB2b2lkIGNyeXB0ZnNfcmVib290KFJlYm9vdFR5cGUgcnQpCi17Ci0gIHN3aXRjaCAocnQpIHsKLSAgICAgIGNhc2UgUmVib290VHlwZTo6cmVib290OgotICAgICAgICAgIHByb3BlcnR5X3NldChBTkRST0lEX1JCX1BST1BFUlRZLCAicmVib290Iik7Ci0gICAgICAgICAgYnJlYWs7CitlbnVtIGNsYXNzIFJlYm9vdFR5cGUgeyByZWJvb3QsIHJlY292ZXJ5LCBzaHV0ZG93biB9Oworc3RhdGljIHZvaWQgY3J5cHRmc19yZWJvb3QoUmVib290VHlwZSBydCkgeworICAgIHN3aXRjaCAocnQpIHsKKyAgICAgICAgY2FzZSBSZWJvb3RUeXBlOjpyZWJvb3Q6CisgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoQU5EUk9JRF9SQl9QUk9QRVJUWSwgInJlYm9vdCIpOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgUmVib290VHlwZTo6cmVjb3Zlcnk6Ci0gICAgICAgICAgcHJvcGVydHlfc2V0KEFORFJPSURfUkJfUFJPUEVSVFksICJyZWJvb3QscmVjb3ZlcnkiKTsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSZWJvb3RUeXBlOjpyZWNvdmVyeToKKyAgICAgICAgICAgIHByb3BlcnR5X3NldChBTkRST0lEX1JCX1BST1BFUlRZLCAicmVib290LHJlY292ZXJ5Iik7CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBSZWJvb3RUeXBlOjpzaHV0ZG93bjoKLSAgICAgICAgICBwcm9wZXJ0eV9zZXQoQU5EUk9JRF9SQl9QUk9QRVJUWSwgInNodXRkb3duIik7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUmVib290VHlwZTo6c2h1dGRvd246CisgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoQU5EUk9JRF9SQl9QUk9QRVJUWSwgInNodXRkb3duIik7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBzbGVlcCgyMCk7CkBAIC0yNTMsOCArMjQ1LDcgQEAKICAgICByZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGlvY3RsX2luaXQoc3RydWN0IGRtX2lvY3RsICppbywgc2l6ZV90IGRhdGFTaXplLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBmbGFncykKLXsKK3N0YXRpYyB2b2lkIGlvY3RsX2luaXQoc3RydWN0IGRtX2lvY3RsKiBpbywgc2l6ZV90IGRhdGFTaXplLCBjb25zdCBjaGFyKiBuYW1lLCB1bnNpZ25lZCBmbGFncykgewogICAgIG1lbXNldChpbywgMCwgZGF0YVNpemUpOwogICAgIGlvLT5kYXRhX3NpemUgPSBkYXRhU2l6ZTsKICAgICBpby0+ZGF0YV9zdGFydCA9IHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpOwpAQCAtMjcyLDcgKzI2Myw3IEBACiBzdHJ1Y3QgQ3J5cHRvVHlwZTsKIAogLy8gVXNlIHRvIGdldCB0aGUgQ3J5cHRvVHlwZSBpbiB1c2Ugb24gdGhpcyBkZXZpY2UuCi1jb25zdCBDcnlwdG9UeXBlICZnZXRfY3J5cHRvX3R5cGUoKTsKK2NvbnN0IENyeXB0b1R5cGUmIGdldF9jcnlwdG9fdHlwZSgpOwogCiBzdHJ1Y3QgQ3J5cHRvVHlwZSB7CiAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgYmUgY29uc3RydWN0aW5nIENyeXB0b1R5cGVzIGFzIHBhcnQgb2YKQEAgLTI4NCw2MCArMjc1LDYwIEBACiAgICAgY29uc3RleHByIENyeXB0b1R5cGUgc2V0X2tleXNpemUodWludDMyX3Qgc2l6ZSkgY29uc3QgewogICAgICAgICByZXR1cm4gQ3J5cHRvVHlwZSh0aGlzLT5wcm9wZXJ0eV9uYW1lLCB0aGlzLT5jcnlwdG9fbmFtZSwgc2l6ZSk7CiAgICAgfQotICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlIHNldF9wcm9wZXJ0eV9uYW1lKGNvbnN0IGNoYXIgKnByb3BlcnR5KSBjb25zdCB7CisgICAgY29uc3RleHByIENyeXB0b1R5cGUgc2V0X3Byb3BlcnR5X25hbWUoY29uc3QgY2hhciogcHJvcGVydHkpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIENyeXB0b1R5cGUocHJvcGVydHksIHRoaXMtPmNyeXB0b19uYW1lLCB0aGlzLT5rZXlzaXplKTsKICAgICB9Ci0gICAgY29uc3RleHByIENyeXB0b1R5cGUgc2V0X2NyeXB0b19uYW1lKGNvbnN0IGNoYXIgKmNyeXB0bykgY29uc3QgeworICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlIHNldF9jcnlwdG9fbmFtZShjb25zdCBjaGFyKiBjcnlwdG8pIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIENyeXB0b1R5cGUodGhpcy0+cHJvcGVydHlfbmFtZSwgY3J5cHRvLCB0aGlzLT5rZXlzaXplKTsKICAgICB9CiAKLSAgICBjb25zdGV4cHIgY29uc3QgY2hhciAqZ2V0X3Byb3BlcnR5X25hbWUoKSBjb25zdCB7IHJldHVybiBwcm9wZXJ0eV9uYW1lOyB9Ci0gICAgY29uc3RleHByIGNvbnN0IGNoYXIgKmdldF9jcnlwdG9fbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGNyeXB0b19uYW1lOyB9CisgICAgY29uc3RleHByIGNvbnN0IGNoYXIqIGdldF9wcm9wZXJ0eV9uYW1lKCkgY29uc3QgeyByZXR1cm4gcHJvcGVydHlfbmFtZTsgfQorICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBnZXRfY3J5cHRvX25hbWUoKSBjb25zdCB7IHJldHVybiBjcnlwdG9fbmFtZTsgfQogICAgIGNvbnN0ZXhwciB1aW50MzJfdCBnZXRfa2V5c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGtleXNpemU7IH0KIAotIHByaXZhdGU6Ci0gICAgY29uc3QgY2hhciAqcHJvcGVydHlfbmFtZTsKLSAgICBjb25zdCBjaGFyICpjcnlwdG9fbmFtZTsKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBwcm9wZXJ0eV9uYW1lOworICAgIGNvbnN0IGNoYXIqIGNyeXB0b19uYW1lOwogICAgIHVpbnQzMl90IGtleXNpemU7CiAKLSAgICBjb25zdGV4cHIgQ3J5cHRvVHlwZShjb25zdCBjaGFyICpwcm9wZXJ0eSwgY29uc3QgY2hhciAqY3J5cHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtzaXplKQorICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlKGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiBjcnlwdG8sIHVpbnQzMl90IGtzaXplKQogICAgICAgICA6IHByb3BlcnR5X25hbWUocHJvcGVydHkpLCBjcnlwdG9fbmFtZShjcnlwdG8pLCBrZXlzaXplKGtzaXplKSB7fQotICAgIGZyaWVuZCBjb25zdCBDcnlwdG9UeXBlICZnZXRfY3J5cHRvX3R5cGUoKTsKLSAgICBzdGF0aWMgY29uc3QgQ3J5cHRvVHlwZSAmZ2V0X2RldmljZV9jcnlwdG9fYWxnb3JpdGhtKCk7CisgICAgZnJpZW5kIGNvbnN0IENyeXB0b1R5cGUmIGdldF9jcnlwdG9fdHlwZSgpOworICAgIHN0YXRpYyBjb25zdCBDcnlwdG9UeXBlJiBnZXRfZGV2aWNlX2NyeXB0b19hbGdvcml0aG0oKTsKIH07CiAKIC8vIFdlIG9ubHkgd2FudCB0byBwYXJzZSB0aGlzIHJlYWQtb25seSBwcm9wZXJ0eSBvbmNlLiAgQnV0IHdlIG5lZWQgdG8gd2FpdAogLy8gdW50aWwgdGhlIHN5c3RlbSBpcyBpbml0aWFsaXplZCBiZWZvcmUgd2UgY2FuIHJlYWQgaXQuICBTbyB3ZSB1c2UgYSBzdGF0aWMKIC8vIHNjb3BlZCB3aXRoaW4gdGhpcyBmdW5jdGlvbiB0byBnZXQgaXQgb25seSBvbmNlLgotY29uc3QgQ3J5cHRvVHlwZSAmZ2V0X2NyeXB0b190eXBlKCkgeworY29uc3QgQ3J5cHRvVHlwZSYgZ2V0X2NyeXB0b190eXBlKCkgewogICAgIHN0YXRpYyBDcnlwdG9UeXBlIGNyeXB0b190eXBlID0gQ3J5cHRvVHlwZTo6Z2V0X2RldmljZV9jcnlwdG9fYWxnb3JpdGhtKCk7CiAgICAgcmV0dXJuIGNyeXB0b190eXBlOwogfQogCiBjb25zdGV4cHIgQ3J5cHRvVHlwZSBkZWZhdWx0X2NyeXB0b190eXBlID0gQ3J5cHRvVHlwZSgpCi0gICAgLnNldF9wcm9wZXJ0eV9uYW1lKCJBRVMtMTI4LUNCQyIpCi0gICAgLnNldF9jcnlwdG9fbmFtZSgiYWVzLWNiYy1lc3NpdjpzaGEyNTYiKQotICAgIC5zZXRfa2V5c2l6ZSgxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRfcHJvcGVydHlfbmFtZSgiQUVTLTEyOC1DQkMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0X2NyeXB0b19uYW1lKCJhZXMtY2JjLWVzc2l2OnNoYTI1NiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRfa2V5c2l6ZSgxNik7CiAKIGNvbnN0ZXhwciBDcnlwdG9UeXBlIHN1cHBvcnRlZF9jcnlwdG9fdHlwZXNbXSA9IHsKICAgICBkZWZhdWx0X2NyeXB0b190eXBlLAogICAgIC8vIEFkZCBuZXcgQ3J5cHRvVHlwZXMgaGVyZS4gIE9yZGVyIGlzIG5vdCBpbXBvcnRhbnQuCiB9OwogCi0KIC8vIC0tLS0tLS0tLS0gU1RBUlQgQ09NUElMRS1USU1FIFNBTklUWSBDSEVDSyBCTE9DSyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBXZSBjb25maXJtIGFsbCBzdXBwb3J0ZWRfY3J5cHRvX3R5cGVzIGhhdmUgYSBzbWFsbCBlbm91Z2gga2V5c2l6ZSBhbmQKIC8vIGhhZCBib3RoIHNldF9wcm9wZXJ0eV9uYW1lKCkgYW5kIHNldF9jcnlwdG9fbmFtZSgpIGNhbGxlZC4KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY29uc3RleHByIHNpemVfdCBhcnJheV9sZW5ndGgoVCAoJilbTl0pIHsgcmV0dXJuIE47IH0KK2NvbnN0ZXhwciBzaXplX3QgYXJyYXlfbGVuZ3RoKFQgKCYpW05dKSB7CisgICAgcmV0dXJuIE47Cit9CiAKIGNvbnN0ZXhwciBib29sIGluZGV4T3V0T2ZCb3VuZHNGb3JDcnlwdG9UeXBlcyhzaXplX3QgaW5kZXgpIHsKICAgICByZXR1cm4gKGluZGV4ID49IGFycmF5X2xlbmd0aChzdXBwb3J0ZWRfY3J5cHRvX3R5cGVzKSk7CiB9CiAKLWNvbnN0ZXhwciBib29sIGlzVmFsaWRDcnlwdG9UeXBlKGNvbnN0IENyeXB0b1R5cGUgJmNyeXB0b190eXBlKSB7Citjb25zdGV4cHIgYm9vbCBpc1ZhbGlkQ3J5cHRvVHlwZShjb25zdCBDcnlwdG9UeXBlJiBjcnlwdG9fdHlwZSkgewogICAgIHJldHVybiAoKGNyeXB0b190eXBlLmdldF9wcm9wZXJ0eV9uYW1lKCkgIT0gbnVsbHB0cikgJiYKICAgICAgICAgICAgIChjcnlwdG9fdHlwZS5nZXRfY3J5cHRvX25hbWUoKSAhPSBudWxscHRyKSAmJgogICAgICAgICAgICAgKGNyeXB0b190eXBlLmdldF9rZXlzaXplKCkgPD0gTUFYX0tFWV9MRU4pKTsKQEAgLTM0OCw4ICszMzksOCBAQAogLy8gYnV0IGl0J3MgYXNzZXJ0aW5nIGF0IGNvbXBpbGUgdGltZSB0aGF0IGFsbCBvZiBvdXIga2V5IGxlbmd0aHMgYXJlIHZhbGlkLgogY29uc3RleHByIGJvb2wgdmFsaWRhdGVTdXBwb3J0ZWRDcnlwdG9UeXBlcyhzaXplX3QgaW5kZXgpIHsKICAgICByZXR1cm4gaW5kZXhPdXRPZkJvdW5kc0ZvckNyeXB0b1R5cGVzKGluZGV4KSB8fAotICAgICAgICAoaXNWYWxpZENyeXB0b1R5cGUoc3VwcG9ydGVkX2NyeXB0b190eXBlc1tpbmRleF0pICYmCi0gICAgICAgICB2YWxpZGF0ZVN1cHBvcnRlZENyeXB0b1R5cGVzKGluZGV4ICsgMSkpOworICAgICAgICAgICAoaXNWYWxpZENyeXB0b1R5cGUoc3VwcG9ydGVkX2NyeXB0b190eXBlc1tpbmRleF0pICYmCisgICAgICAgICAgICB2YWxpZGF0ZVN1cHBvcnRlZENyeXB0b1R5cGVzKGluZGV4ICsgMSkpOwogfQogCiBzdGF0aWNfYXNzZXJ0KHZhbGlkYXRlU3VwcG9ydGVkQ3J5cHRvVHlwZXMoMCksCkBAIC0zNTcsMzQgKzM0OCwzMCBAQAogICAgICAgICAgICAgICAiaW5jb21wbGV0ZWx5IGNvbnN0cnVjdGVkLiIpOwogLy8gIC0tLS0tLS0tLS0gRU5EIENPTVBJTEUtVElNRSBTQU5JVFkgQ0hFQ0sgQkxPQ0sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0KIC8vIERvbid0IGNhbGwgdGhpcyBkaXJlY3RseSwgdXNlIGdldF9jcnlwdG9fdHlwZSgpLCB3aGljaCBjYWNoZXMgdGhpcyByZXN1bHQuCi1jb25zdCBDcnlwdG9UeXBlICZDcnlwdG9UeXBlOjpnZXRfZGV2aWNlX2NyeXB0b19hbGdvcml0aG0oKSB7Citjb25zdCBDcnlwdG9UeXBlJiBDcnlwdG9UeXBlOjpnZXRfZGV2aWNlX2NyeXB0b19hbGdvcml0aG0oKSB7CiAgICAgY29uc3RleHByIGNoYXIgQ1JZUFRfQUxHT19QUk9QW10gPSAicm8uY3J5cHRvLmZkZV9hbGdvcml0aG0iOwogICAgIGNoYXIgcGFyYW1zdHJbUFJPUEVSVFlfVkFMVUVfTUFYXTsKIAotICAgIHByb3BlcnR5X2dldChDUllQVF9BTEdPX1BST1AsIHBhcmFtc3RyLAotICAgICAgICAgICAgICAgICBkZWZhdWx0X2NyeXB0b190eXBlLmdldF9wcm9wZXJ0eV9uYW1lKCkpOwotICAgIGZvciAoYXV0byBjb25zdCAmY3R5cGUgOiBzdXBwb3J0ZWRfY3J5cHRvX3R5cGVzKSB7CisgICAgcHJvcGVydHlfZ2V0KENSWVBUX0FMR09fUFJPUCwgcGFyYW1zdHIsIGRlZmF1bHRfY3J5cHRvX3R5cGUuZ2V0X3Byb3BlcnR5X25hbWUoKSk7CisgICAgZm9yIChhdXRvIGNvbnN0JiBjdHlwZSA6IHN1cHBvcnRlZF9jcnlwdG9fdHlwZXMpIHsKICAgICAgICAgaWYgKHN0cmNtcChwYXJhbXN0ciwgY3R5cGUuZ2V0X3Byb3BlcnR5X25hbWUoKSkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGN0eXBlOwogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dFKCJJbnZhbGlkIG5hbWUgKCVzKSBmb3IgJXMuICBEZWZhdWx0aW5nIHRvICVzXG4iLCBwYXJhbXN0ciwKLSAgICAgICAgICBDUllQVF9BTEdPX1BST1AsIGRlZmF1bHRfY3J5cHRvX3R5cGUuZ2V0X3Byb3BlcnR5X25hbWUoKSk7CisgICAgQUxPR0UoIkludmFsaWQgbmFtZSAoJXMpIGZvciAlcy4gIERlZmF1bHRpbmcgdG8gJXNcbiIsIHBhcmFtc3RyLCBDUllQVF9BTEdPX1BST1AsCisgICAgICAgICAgZGVmYXVsdF9jcnlwdG9fdHlwZS5nZXRfcHJvcGVydHlfbmFtZSgpKTsKICAgICByZXR1cm4gZGVmYXVsdF9jcnlwdG9fdHlwZTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLQotCiAvKioKICAqIEdldHMgdGhlIGRlZmF1bHQgZGV2aWNlIHNjcnlwdCBwYXJhbWV0ZXJzIGZvciBrZXkgZGVyaXZhdGlvbiB0aW1lIHR1bmluZy4KICAqIFRoZSBwYXJhbWV0ZXJzIHNob3VsZCBsZWFkIHRvIGFib3V0IG9uZSBzZWNvbmQgZGVyaXZhdGlvbiB0aW1lIGZvciB0aGUKICAqIGdpdmVuIGRldmljZS4KICAqLwotc3RhdGljIHZvaWQgZ2V0X2RldmljZV9zY3J5cHRfcGFyYW1zKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIpIHsKK3N0YXRpYyB2b2lkIGdldF9kZXZpY2Vfc2NyeXB0X3BhcmFtcyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyKSB7CiAgICAgY2hhciBwYXJhbXN0cltQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGludCBOZiwgcmYsIHBmOwogCkBAIC00MDIsMTcgKzM4OSwxNiBAQAogICAgIHJldHVybiBnZXRfY3J5cHRvX3R5cGUoKS5nZXRfa2V5c2l6ZSgpOwogfQogCi1jb25zdCBjaGFyICpjcnlwdGZzX2dldF9jcnlwdG9fbmFtZSgpIHsKK2NvbnN0IGNoYXIqIGNyeXB0ZnNfZ2V0X2NyeXB0b19uYW1lKCkgewogICAgIHJldHVybiBnZXRfY3J5cHRvX3R5cGUoKS5nZXRfY3J5cHRvX25hbWUoKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBnZXRfZnNfc2l6ZShjaGFyICpkZXYpCi17CitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9mc19zaXplKGNoYXIqIGRldikgewogICAgIGludCBmZCwgYmxvY2tfc2l6ZTsKICAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayBzYjsKICAgICBvZmY2NF90IGxlbjsKIAotICAgIGlmICgoZmQgPSBvcGVuKGRldiwgT19SRE9OTFl8T19DTE9FWEVDKSkgPCAwKSB7CisgICAgaWYgKChmZCA9IG9wZW4oZGV2LCBPX1JET05MWSB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBTTE9HRSgiQ2Fubm90IG9wZW4gZGV2aWNlIHRvIGdldCBmaWxlc3lzdGVtIHNpemUgIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTQzNSw2OCArNDIxLDY2IEBACiAgICAgfQogICAgIGJsb2NrX3NpemUgPSAxMDI0IDw8IHNiLnNfbG9nX2Jsb2NrX3NpemU7CiAgICAgLyogY29tcHV0ZSBsZW5ndGggaW4gYnl0ZXMgKi8KLSAgICBsZW4gPSAoICgob2ZmNjRfdClzYi5zX2Jsb2Nrc19jb3VudF9oaSA8PCAzMikgKyBzYi5zX2Jsb2Nrc19jb3VudF9sbykgKiBibG9ja19zaXplOworICAgIGxlbiA9ICgoKG9mZjY0X3Qpc2Iuc19ibG9ja3NfY291bnRfaGkgPDwgMzIpICsgc2Iuc19ibG9ja3NfY291bnRfbG8pICogYmxvY2tfc2l6ZTsKIAogICAgIC8qIHJldHVybiBsZW5ndGggaW4gc2VjdG9ycyAqLwotICAgIHJldHVybiAodW5zaWduZWQgaW50KSAobGVuIC8gNTEyKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGludCkobGVuIC8gNTEyKTsKIH0KIAotc3RhdGljIGludCBnZXRfY3J5cHRfZnRyX2luZm8oY2hhciAqKm1ldGFkYXRhX2ZuYW1lLCBvZmY2NF90ICpvZmYpCi17Ci0gIHN0YXRpYyBpbnQgY2FjaGVkX2RhdGEgPSAwOwotICBzdGF0aWMgb2ZmNjRfdCBjYWNoZWRfb2ZmID0gMDsKLSAgc3RhdGljIGNoYXIgY2FjaGVkX21ldGFkYXRhX2ZuYW1lW1BST1BFUlRZX1ZBTFVFX01BWF0gPSAiIjsKLSAgaW50IGZkOwotICBjaGFyIGtleV9sb2NbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgY2hhciByZWFsX2Jsa2RldltQUk9QRVJUWV9WQUxVRV9NQVhdOwotICBpbnQgcmMgPSAtMTsKK3N0YXRpYyBpbnQgZ2V0X2NyeXB0X2Z0cl9pbmZvKGNoYXIqKiBtZXRhZGF0YV9mbmFtZSwgb2ZmNjRfdCogb2ZmKSB7CisgICAgc3RhdGljIGludCBjYWNoZWRfZGF0YSA9IDA7CisgICAgc3RhdGljIG9mZjY0X3QgY2FjaGVkX29mZiA9IDA7CisgICAgc3RhdGljIGNoYXIgY2FjaGVkX21ldGFkYXRhX2ZuYW1lW1BST1BFUlRZX1ZBTFVFX01BWF0gPSAiIjsKKyAgICBpbnQgZmQ7CisgICAgY2hhciBrZXlfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgY2hhciByZWFsX2Jsa2RldltQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGludCByYyA9IC0xOwogCi0gIGlmICghY2FjaGVkX2RhdGEpIHsKLSAgICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwga2V5X2xvYywgcmVhbF9ibGtkZXYsIHNpemVvZihrZXlfbG9jKSk7CisgICAgaWYgKCFjYWNoZWRfZGF0YSkgeworICAgICAgICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwga2V5X2xvYywgcmVhbF9ibGtkZXYsIHNpemVvZihrZXlfbG9jKSk7CiAKLSAgICBpZiAoIXN0cmNtcChrZXlfbG9jLCBLRVlfSU5fRk9PVEVSKSkgewotICAgICAgaWYgKCAoZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JEV1J8T19DTE9FWEVDKSkgPCAwKSB7Ci0gICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiByZWFsIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9CisgICAgICAgIGlmICghc3RyY21wKGtleV9sb2MsIEtFWV9JTl9GT09URVIpKSB7CisgICAgICAgICAgICBpZiAoKGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRFdSIHwgT19DTE9FWEVDKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIHJlYWwgYmxvY2sgZGV2aWNlICVzXG4iLCByZWFsX2Jsa2Rldik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogCi0gICAgICB1bnNpZ25lZCBsb25nIG5yX3NlYyA9IDA7Ci0gICAgICBnZXRfYmxrZGV2X3NpemUoZmQsICZucl9zZWMpOwotICAgICAgaWYgKG5yX3NlYyAhPSAwKSB7Ci0gICAgICAgIC8qIElmIGl0J3MgYW4gZW5jcnlwdGVkIEFuZHJvaWQgcGFydGl0aW9uLCB0aGUgbGFzdCAxNiBLYnl0ZXMgY29udGFpbiB0aGUKLSAgICAgICAgICogZW5jcnlwdGlvbiBpbmZvIGZvb3RlciBhbmQga2V5LCBhbmQgcGxlbnR5IG9mIGJ5dGVzIHRvIHNwYXJlIGZvciBmdXR1cmUKLSAgICAgICAgICogZ3Jvd3RoLgotICAgICAgICAgKi8KLSAgICAgICAgc3RybGNweShjYWNoZWRfbWV0YWRhdGFfZm5hbWUsIHJlYWxfYmxrZGV2LCBzaXplb2YoY2FjaGVkX21ldGFkYXRhX2ZuYW1lKSk7Ci0gICAgICAgIGNhY2hlZF9vZmYgPSAoKG9mZjY0X3QpbnJfc2VjICogNTEyKSAtIENSWVBUX0ZPT1RFUl9PRkZTRVQ7Ci0gICAgICAgIGNhY2hlZF9kYXRhID0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNMT0dFKCJDYW5ub3QgZ2V0IHNpemUgb2YgYmxvY2sgZGV2aWNlICVzXG4iLCByZWFsX2Jsa2Rldik7Ci0gICAgICB9Ci0gICAgICBjbG9zZShmZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0cmxjcHkoY2FjaGVkX21ldGFkYXRhX2ZuYW1lLCBrZXlfbG9jLCBzaXplb2YoY2FjaGVkX21ldGFkYXRhX2ZuYW1lKSk7Ci0gICAgICBjYWNoZWRfb2ZmID0gMDsKLSAgICAgIGNhY2hlZF9kYXRhID0gMTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VjID0gMDsKKyAgICAgICAgICAgIGdldF9ibGtkZXZfc2l6ZShmZCwgJm5yX3NlYyk7CisgICAgICAgICAgICBpZiAobnJfc2VjICE9IDApIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBpdCdzIGFuIGVuY3J5cHRlZCBBbmRyb2lkIHBhcnRpdGlvbiwgdGhlIGxhc3QgMTYgS2J5dGVzIGNvbnRhaW4gdGhlCisgICAgICAgICAgICAgICAgICogZW5jcnlwdGlvbiBpbmZvIGZvb3RlciBhbmQga2V5LCBhbmQgcGxlbnR5IG9mIGJ5dGVzIHRvIHNwYXJlIGZvciBmdXR1cmUKKyAgICAgICAgICAgICAgICAgKiBncm93dGguCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc3RybGNweShjYWNoZWRfbWV0YWRhdGFfZm5hbWUsIHJlYWxfYmxrZGV2LCBzaXplb2YoY2FjaGVkX21ldGFkYXRhX2ZuYW1lKSk7CisgICAgICAgICAgICAgICAgY2FjaGVkX29mZiA9ICgob2ZmNjRfdClucl9zZWMgKiA1MTIpIC0gQ1JZUFRfRk9PVEVSX09GRlNFVDsKKyAgICAgICAgICAgICAgICBjYWNoZWRfZGF0YSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNMT0dFKCJDYW5ub3QgZ2V0IHNpemUgb2YgYmxvY2sgZGV2aWNlICVzXG4iLCByZWFsX2Jsa2Rldik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJsY3B5KGNhY2hlZF9tZXRhZGF0YV9mbmFtZSwga2V5X2xvYywgc2l6ZW9mKGNhY2hlZF9tZXRhZGF0YV9mbmFtZSkpOworICAgICAgICAgICAgY2FjaGVkX29mZiA9IDA7CisgICAgICAgICAgICBjYWNoZWRfZGF0YSA9IDE7CisgICAgICAgIH0KICAgICB9Ci0gIH0KIAotICBpZiAoY2FjaGVkX2RhdGEpIHsKLSAgICBpZiAobWV0YWRhdGFfZm5hbWUpIHsKLSAgICAgICAgKm1ldGFkYXRhX2ZuYW1lID0gY2FjaGVkX21ldGFkYXRhX2ZuYW1lOworICAgIGlmIChjYWNoZWRfZGF0YSkgeworICAgICAgICBpZiAobWV0YWRhdGFfZm5hbWUpIHsKKyAgICAgICAgICAgICptZXRhZGF0YV9mbmFtZSA9IGNhY2hlZF9tZXRhZGF0YV9mbmFtZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2ZmKSB7CisgICAgICAgICAgICAqb2ZmID0gY2FjaGVkX29mZjsKKyAgICAgICAgfQorICAgICAgICByYyA9IDA7CiAgICAgfQotICAgIGlmIChvZmYpIHsKLSAgICAgICAgKm9mZiA9IGNhY2hlZF9vZmY7Ci0gICAgfQotICAgIHJjID0gMDsKLSAgfQogCi0gIHJldHVybiByYzsKKyAgICByZXR1cm4gcmM7CiB9CiAKIC8qIFNldCBzaGEyNTYgY2hlY2tzdW0gaW4gc3RydWN0dXJlICovCi1zdGF0aWMgdm9pZCBzZXRfZnRyX3NoYShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyKQoteworc3RhdGljIHZvaWQgc2V0X2Z0cl9zaGEoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgewogICAgIFNIQTI1Nl9DVFggYzsKICAgICBTSEEyNTZfSW5pdCgmYyk7CiAgICAgbWVtc2V0KGNyeXB0X2Z0ci0+c2hhMjU2LCAwLCBzaXplb2YoY3J5cHRfZnRyLT5zaGEyNTYpKTsKQEAgLTUwNyw4MiArNDkxLDc2IEBACiAvKiBrZXkgb3Igc2FsdCBjYW4gYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBqdXN0IHNraXAgd3JpdGluZyB0aGF0IHZhbHVlLiAgVXNlZnVsIHRvCiAgKiB1cGRhdGUgdGhlIGZhaWxlZCBtb3VudCBjb3VudCBidXQgbm90IGNoYW5nZSB0aGUga2V5LgogICovCi1zdGF0aWMgaW50IHB1dF9jcnlwdF9mdHJfYW5kX2tleShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyKQotewotICBpbnQgZmQ7Ci0gIHVuc2lnbmVkIGludCBjbnQ7Ci0gIC8qIHN0YXJ0aW5nX29mZiBpcyBzZXQgdG8gdGhlIFNFRUtfU0VUIG9mZnNldAotICAgKiB3aGVyZSB0aGUgY3J5cHRvIHN0cnVjdHVyZSBzdGFydHMKLSAgICovCi0gIG9mZjY0X3Qgc3RhcnRpbmdfb2ZmOwotICBpbnQgcmMgPSAtMTsKLSAgY2hhciAqZm5hbWUgPSBOVUxMOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworc3RhdGljIGludCBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgeworICAgIGludCBmZDsKKyAgICB1bnNpZ25lZCBpbnQgY250OworICAgIC8qIHN0YXJ0aW5nX29mZiBpcyBzZXQgdG8gdGhlIFNFRUtfU0VUIG9mZnNldAorICAgICAqIHdoZXJlIHRoZSBjcnlwdG8gc3RydWN0dXJlIHN0YXJ0cworICAgICAqLworICAgIG9mZjY0X3Qgc3RhcnRpbmdfb2ZmOworICAgIGludCByYyA9IC0xOworICAgIGNoYXIqIGZuYW1lID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogCi0gIHNldF9mdHJfc2hhKGNyeXB0X2Z0cik7CisgICAgc2V0X2Z0cl9zaGEoY3J5cHRfZnRyKTsKIAotICBpZiAoZ2V0X2NyeXB0X2Z0cl9pbmZvKCZmbmFtZSwgJnN0YXJ0aW5nX29mZikpIHsKLSAgICBTTE9HRSgiVW5hYmxlIHRvIGdldCBjcnlwdF9mdHJfaW5mb1xuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChmbmFtZVswXSAhPSAnLycpIHsKLSAgICBTTE9HRSgiVW5leHBlY3RlZCB2YWx1ZSBmb3IgY3J5cHRvIGtleSBsb2NhdGlvblxuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmICggKGZkID0gb3BlbihmbmFtZSwgT19SRFdSIHwgT19DUkVBVHxPX0NMT0VYRUMsIDA2MDApKSA8IDApIHsKLSAgICBTTE9HRSgiQ2Fubm90IG9wZW4gZm9vdGVyIGZpbGUgJXMgZm9yIHB1dFxuIiwgZm5hbWUpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjcnlwdCBmb290ZXIgKi8KLSAgaWYgKGxzZWVrNjQoZmQsIHN0YXJ0aW5nX29mZiwgU0VFS19TRVQpID09IC0xKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCBzZWVrIHRvIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlclxuIik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KLQotICBpZiAoKGNudCA9IHdyaXRlKGZkLCBjcnlwdF9mdHIsIHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpKSAhPSBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCB3cml0ZSByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOwotICAgIGdvdG8gZXJyb3V0OwotICB9Ci0KLSAgZnN0YXQoZmQsICZzdGF0YnVmKTsKLSAgLyogSWYgdGhlIGtleXMgYXJlIGtlcHQgb24gYSByYXcgYmxvY2sgZGV2aWNlLCBkbyBub3QgdHJ5IHRvIHRydW5jYXRlIGl0LiAqLwotICBpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpKSB7Ci0gICAgaWYgKGZ0cnVuY2F0ZShmZCwgMHg0MDAwKSkgewotICAgICAgU0xPR0UoIkNhbm5vdCBzZXQgZm9vdGVyIGZpbGUgc2l6ZVxuIik7Ci0gICAgICBnb3RvIGVycm91dDsKKyAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9pbmZvKCZmbmFtZSwgJnN0YXJ0aW5nX29mZikpIHsKKyAgICAgICAgU0xPR0UoIlVuYWJsZSB0byBnZXQgY3J5cHRfZnRyX2luZm9cbiIpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICB9CisgICAgaWYgKGZuYW1lWzBdICE9ICcvJykgeworICAgICAgICBTTE9HRSgiVW5leHBlY3RlZCB2YWx1ZSBmb3IgY3J5cHRvIGtleSBsb2NhdGlvblxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX0NMT0VYRUMsIDA2MDApKSA8IDApIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIGZvb3RlciBmaWxlICVzIGZvciBwdXRcbiIsIGZuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotICAvKiBTdWNjZXNzISAqLwotICByYyA9IDA7CisgICAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGNyeXB0IGZvb3RlciAqLworICAgIGlmIChsc2VlazY0KGZkLCBzdGFydGluZ19vZmYsIFNFRUtfU0VUKSA9PSAtMSkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IHNlZWsgdG8gcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQorCisgICAgaWYgKChjbnQgPSB3cml0ZShmZCwgY3J5cHRfZnRyLCBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSkgIT0gc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IHdyaXRlIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlclxuIik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KKworICAgIGZzdGF0KGZkLCAmc3RhdGJ1Zik7CisgICAgLyogSWYgdGhlIGtleXMgYXJlIGtlcHQgb24gYSByYXcgYmxvY2sgZGV2aWNlLCBkbyBub3QgdHJ5IHRvIHRydW5jYXRlIGl0LiAqLworICAgIGlmIChTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgaWYgKGZ0cnVuY2F0ZShmZCwgMHg0MDAwKSkgeworICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCBzZXQgZm9vdGVyIGZpbGUgc2l6ZVxuIik7CisgICAgICAgICAgICBnb3RvIGVycm91dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFN1Y2Nlc3MhICovCisgICAgcmMgPSAwOwogCiBlcnJvdXQ6Ci0gIGNsb3NlKGZkKTsKLSAgcmV0dXJuIHJjOwotCisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiByYzsKIH0KIAotc3RhdGljIGJvb2wgY2hlY2tfZnRyX3NoYShjb25zdCBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyKQoteworc3RhdGljIGJvb2wgY2hlY2tfZnRyX3NoYShjb25zdCBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyKSB7CiAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgY29weTsKICAgICBtZW1jcHkoJmNvcHksIGNyeXB0X2Z0ciwgc2l6ZW9mKGNvcHkpKTsKICAgICBzZXRfZnRyX3NoYSgmY29weSk7CiAgICAgcmV0dXJuIG1lbWNtcChjb3B5LnNoYTI1NiwgY3J5cHRfZnRyLT5zaGEyNTYsIHNpemVvZihjb3B5LnNoYTI1NikpID09IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVuaXhfcmVhZChpbnQgIGZkLCB2b2lkKiAgYnVmZiwgaW50ICBsZW4pCi17CitzdGF0aWMgaW5saW5lIGludCB1bml4X3JlYWQoaW50IGZkLCB2b2lkKiBidWZmLCBpbnQgbGVuKSB7CiAgICAgcmV0dXJuIFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCBidWZmLCBsZW4pKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdW5peF93cml0ZShpbnQgIGZkLCBjb25zdCB2b2lkKiAgYnVmZiwgaW50ICBsZW4pCi17CitzdGF0aWMgaW5saW5lIGludCB1bml4X3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogYnVmZiwgaW50IGxlbikgewogICAgIHJldHVybiBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoZmQsIGJ1ZmYsIGxlbikpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X2VtcHR5X3BlcnNpc3RfZGF0YShzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhICpwZGF0YSwgaW50IGxlbikKLXsKK3N0YXRpYyB2b2lkIGluaXRfZW1wdHlfcGVyc2lzdF9kYXRhKHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEqIHBkYXRhLCBpbnQgbGVuKSB7CiAgICAgbWVtc2V0KHBkYXRhLCAwLCBsZW4pOwogICAgIHBkYXRhLT5wZXJzaXN0X21hZ2ljID0gUEVSU0lTVF9EQVRBX01BR0lDOwogICAgIHBkYXRhLT5wZXJzaXN0X3ZhbGlkX2VudHJpZXMgPSAwOwpAQCAtNTkzLDE4ICs1NzEsMTcgQEAKICAqIGRhdGEsIGNyeXB0X2Z0ciBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCB0byBiZSB1cGRhdGVkLCBhbmQgb2Zmc2V0IGlzIHRoZQogICogYWJzb2x1dGUgb2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgY3J5cHRfbW50X2Z0ciBvbiB0aGUgcGFzc2VkIGluIGZkLgogICovCi1zdGF0aWMgdm9pZCB1cGdyYWRlX2NyeXB0X2Z0cihpbnQgZmQsIHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIsIG9mZjY0X3Qgb2Zmc2V0KQoteworc3RhdGljIHZvaWQgdXBncmFkZV9jcnlwdF9mdHIoaW50IGZkLCBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyLCBvZmY2NF90IG9mZnNldCkgewogICAgIGludCBvcmlnX21ham9yID0gY3J5cHRfZnRyLT5tYWpvcl92ZXJzaW9uOwogICAgIGludCBvcmlnX21pbm9yID0gY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uOwogCiAgICAgaWYgKChjcnlwdF9mdHItPm1ham9yX3ZlcnNpb24gPT0gMSkgJiYgKGNyeXB0X2Z0ci0+bWlub3JfdmVyc2lvbiA9PSAwKSkgewotICAgICAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhICpwZGF0YTsKKyAgICAgICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSogcGRhdGE7CiAgICAgICAgIG9mZjY0X3QgcGRhdGFfb2Zmc2V0ID0gb2Zmc2V0ICsgQ1JZUFRfRk9PVEVSX1RPX1BFUlNJU1RfT0ZGU0VUOwogCiAgICAgICAgIFNMT0dXKCJ1cGdyYWRpbmcgY3J5cHRvIGZvb3RlciB0byAxLjEiKTsKIAotICAgICAgICBwZGF0YSA9IChjcnlwdF9wZXJzaXN0X2RhdGEgKiltYWxsb2MoQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOworICAgICAgICBwZGF0YSA9IChjcnlwdF9wZXJzaXN0X2RhdGEqKW1hbGxvYyhDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7CiAgICAgICAgIGlmIChwZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBTTE9HRSgiQ2Fubm90IGFsbG9jYXRlIHBlcnNpc2VudCBkYXRhXG4iKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTY1Nyw5MSArNjM0LDg5IEBACiAgICAgfQogfQogCitzdGF0aWMgaW50IGdldF9jcnlwdF9mdHJfYW5kX2tleShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyKSB7CisgICAgaW50IGZkOworICAgIHVuc2lnbmVkIGludCBjbnQ7CisgICAgb2ZmNjRfdCBzdGFydGluZ19vZmY7CisgICAgaW50IHJjID0gLTE7CisgICAgY2hhciogZm5hbWUgPSBOVUxMOworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CiAKLXN0YXRpYyBpbnQgZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIpCi17Ci0gIGludCBmZDsKLSAgdW5zaWduZWQgaW50IGNudDsKLSAgb2ZmNjRfdCBzdGFydGluZ19vZmY7Ci0gIGludCByYyA9IC0xOwotICBjaGFyICpmbmFtZSA9IE5VTEw7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgaWYgKGdldF9jcnlwdF9mdHJfaW5mbygmZm5hbWUsICZzdGFydGluZ19vZmYpKSB7CisgICAgICAgIFNMT0dFKCJVbmFibGUgdG8gZ2V0IGNyeXB0X2Z0cl9pbmZvXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZm5hbWVbMF0gIT0gJy8nKSB7CisgICAgICAgIFNMT0dFKCJVbmV4cGVjdGVkIHZhbHVlIGZvciBjcnlwdG8ga2V5IGxvY2F0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGZkID0gb3BlbihmbmFtZSwgT19SRFdSIHwgT19DTE9FWEVDKSkgPCAwKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBmb290ZXIgZmlsZSAlcyBmb3IgZ2V0XG4iLCBmbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLSAgaWYgKGdldF9jcnlwdF9mdHJfaW5mbygmZm5hbWUsICZzdGFydGluZ19vZmYpKSB7Ci0gICAgU0xPR0UoIlVuYWJsZSB0byBnZXQgY3J5cHRfZnRyX2luZm9cbiIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoZm5hbWVbMF0gIT0gJy8nKSB7Ci0gICAgU0xPR0UoIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIGNyeXB0byBrZXkgbG9jYXRpb25cbiIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoIChmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUnxPX0NMT0VYRUMpKSA8IDApIHsKLSAgICBTTE9HRSgiQ2Fubm90IG9wZW4gZm9vdGVyIGZpbGUgJXMgZm9yIGdldFxuIiwgZm5hbWUpOwotICAgIHJldHVybiAtMTsKLSAgfQorICAgIC8qIE1ha2Ugc3VyZSBpdCdzIDE2IEtieXRlcyBpbiBsZW5ndGggKi8KKyAgICBmc3RhdChmZCwgJnN0YXRidWYpOworICAgIGlmIChTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkgJiYgKHN0YXRidWYuc3Rfc2l6ZSAhPSAweDQwMDApKSB7CisgICAgICAgIFNMT0dFKCJmb290ZXIgZmlsZSAlcyBpcyBub3QgdGhlIGV4cGVjdGVkIHNpemUhXG4iLCBmbmFtZSk7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICAvKiBNYWtlIHN1cmUgaXQncyAxNiBLYnl0ZXMgaW4gbGVuZ3RoICovCi0gIGZzdGF0KGZkLCAmc3RhdGJ1Zik7Ci0gIGlmIChTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkgJiYgKHN0YXRidWYuc3Rfc2l6ZSAhPSAweDQwMDApKSB7Ci0gICAgU0xPR0UoImZvb3RlciBmaWxlICVzIGlzIG5vdCB0aGUgZXhwZWN0ZWQgc2l6ZSFcbiIsIGZuYW1lKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjcnlwdCBmb290ZXIgKi8KKyAgICBpZiAobHNlZWs2NChmZCwgc3RhcnRpbmdfb2ZmLCBTRUVLX1NFVCkgPT0gLTEpIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCBzZWVrIHRvIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlclxuIik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgY3J5cHQgZm9vdGVyICovCi0gIGlmIChsc2VlazY0KGZkLCBzdGFydGluZ19vZmYsIFNFRUtfU0VUKSA9PSAtMSkgewotICAgIFNMT0dFKCJDYW5ub3Qgc2VlayB0byByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOwotICAgIGdvdG8gZXJyb3V0OwotICB9CisgICAgaWYgKChjbnQgPSByZWFkKGZkLCBjcnlwdF9mdHIsIHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpKSAhPSBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3QgcmVhZCByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgaWYgKCAoY250ID0gcmVhZChmZCwgY3J5cHRfZnRyLCBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSkgIT0gc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkgewotICAgIFNMT0dFKCJDYW5ub3QgcmVhZCByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOwotICAgIGdvdG8gZXJyb3V0OwotICB9CisgICAgaWYgKGNyeXB0X2Z0ci0+bWFnaWMgIT0gQ1JZUFRfTU5UX01BR0lDKSB7CisgICAgICAgIFNMT0dFKCJCYWQgbWFnaWMgZm9yIHJlYWwgYmxvY2sgZGV2aWNlICVzXG4iLCBmbmFtZSk7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICBpZiAoY3J5cHRfZnRyLT5tYWdpYyAhPSBDUllQVF9NTlRfTUFHSUMpIHsKLSAgICBTTE9HRSgiQmFkIG1hZ2ljIGZvciByZWFsIGJsb2NrIGRldmljZSAlc1xuIiwgZm5hbWUpOwotICAgIGdvdG8gZXJyb3V0OwotICB9CisgICAgaWYgKGNyeXB0X2Z0ci0+bWFqb3JfdmVyc2lvbiAhPSBDVVJSRU5UX01BSk9SX1ZFUlNJT04pIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCB1bmRlcnN0YW5kIG1ham9yIHZlcnNpb24gJWQgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyOyBleHBlY3RlZCAlZFxuIiwKKyAgICAgICAgICAgICAgY3J5cHRfZnRyLT5tYWpvcl92ZXJzaW9uLCBDVVJSRU5UX01BSk9SX1ZFUlNJT04pOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgaWYgKGNyeXB0X2Z0ci0+bWFqb3JfdmVyc2lvbiAhPSBDVVJSRU5UX01BSk9SX1ZFUlNJT04pIHsKLSAgICBTTE9HRSgiQ2Fubm90IHVuZGVyc3RhbmQgbWFqb3IgdmVyc2lvbiAlZCByZWFsIGJsb2NrIGRldmljZSBmb290ZXI7IGV4cGVjdGVkICVkXG4iLAotICAgICAgICAgIGNyeXB0X2Z0ci0+bWFqb3JfdmVyc2lvbiwgQ1VSUkVOVF9NQUpPUl9WRVJTSU9OKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIC8vIFdlIHJpc2sgYnVmZmVyIG92ZXJmbG93cyB3aXRoIG92ZXJzaXplZCBrZXlzLCBzbyB3ZSBqdXN0IHJlamVjdCB0aGVtLgorICAgIC8vIDAtc2l6ZWQga2V5cyBhcmUgcHJvYmxlbWF0aWMgKGVzc2VudGlhbGx5IGJ5LXBhc3NpbmcgZW5jcnlwdGlvbiksIGFuZAorICAgIC8vIEFFUy1DQkMga2V5IHdyYXBwaW5nIG9ubHkgd29ya3MgZm9yIG11bHRpcGxlcyBvZiAxNiBieXRlcy4KKyAgICBpZiAoKGNyeXB0X2Z0ci0+a2V5c2l6ZSA9PSAwKSB8fCAoKGNyeXB0X2Z0ci0+a2V5c2l6ZSAlIDE2KSAhPSAwKSB8fAorICAgICAgICAoY3J5cHRfZnRyLT5rZXlzaXplID4gTUFYX0tFWV9MRU4pKSB7CisgICAgICAgIFNMT0dFKAorICAgICAgICAgICAgIkludmFsaWQga2V5c2l6ZSAoJXUpIGZvciBibG9jayBkZXZpY2UgJXM7IE11c3QgYmUgbm9uLXplcm8sICIKKyAgICAgICAgICAgICJkaXZpc2libGUgYnkgMTYsIGFuZCA8PSAlZFxuIiwKKyAgICAgICAgICAgIGNyeXB0X2Z0ci0+a2V5c2l6ZSwgZm5hbWUsIE1BWF9LRVlfTEVOKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIC8vIFdlIHJpc2sgYnVmZmVyIG92ZXJmbG93cyB3aXRoIG92ZXJzaXplZCBrZXlzLCBzbyB3ZSBqdXN0IHJlamVjdCB0aGVtLgotICAvLyAwLXNpemVkIGtleXMgYXJlIHByb2JsZW1hdGljIChlc3NlbnRpYWxseSBieS1wYXNzaW5nIGVuY3J5cHRpb24pLCBhbmQKLSAgLy8gQUVTLUNCQyBrZXkgd3JhcHBpbmcgb25seSB3b3JrcyBmb3IgbXVsdGlwbGVzIG9mIDE2IGJ5dGVzLgotICBpZiAoKGNyeXB0X2Z0ci0+a2V5c2l6ZSA9PSAwKSB8fCAoKGNyeXB0X2Z0ci0+a2V5c2l6ZSAlIDE2KSAhPSAwKSB8fAotICAgICAgKGNyeXB0X2Z0ci0+a2V5c2l6ZSA+IE1BWF9LRVlfTEVOKSkgewotICAgIFNMT0dFKCJJbnZhbGlkIGtleXNpemUgKCV1KSBmb3IgYmxvY2sgZGV2aWNlICVzOyBNdXN0IGJlIG5vbi16ZXJvLCAiCi0gICAgICAgICAgImRpdmlzaWJsZSBieSAxNiwgYW5kIDw9ICVkXG4iLCBjcnlwdF9mdHItPmtleXNpemUsIGZuYW1lLAotICAgICAgICAgIE1BWF9LRVlfTEVOKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIGlmIChjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24gPiBDVVJSRU5UX01JTk9SX1ZFUlNJT04pIHsKKyAgICAgICAgU0xPR1coIldhcm5pbmc6IGNyeXB0byBmb290ZXIgbWlub3IgdmVyc2lvbiAlZCwgZXhwZWN0ZWQgPD0gJWQsIGNvbnRpbnVpbmcuLi5cbiIsCisgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+bWlub3JfdmVyc2lvbiwgQ1VSUkVOVF9NSU5PUl9WRVJTSU9OKTsKKyAgICB9CiAKLSAgaWYgKGNyeXB0X2Z0ci0+bWlub3JfdmVyc2lvbiA+IENVUlJFTlRfTUlOT1JfVkVSU0lPTikgewotICAgIFNMT0dXKCJXYXJuaW5nOiBjcnlwdG8gZm9vdGVyIG1pbm9yIHZlcnNpb24gJWQsIGV4cGVjdGVkIDw9ICVkLCBjb250aW51aW5nLi4uXG4iLAotICAgICAgICAgIGNyeXB0X2Z0ci0+bWlub3JfdmVyc2lvbiwgQ1VSUkVOVF9NSU5PUl9WRVJTSU9OKTsKLSAgfQorICAgIC8qIElmIHRoaXMgaXMgYSB2ZXJpb24gMS4wIGNyeXB0X2Z0ciwgbWFrZSBpdCBhIDEuMSBjcnlwdCBmb290ZXIsIGFuZCB1cGRhdGUgdGhlCisgICAgICogY29weSBvbiBkaXNrIGJlZm9yZSByZXR1cm5pbmcuCisgICAgICovCisgICAgaWYgKGNyeXB0X2Z0ci0+bWlub3JfdmVyc2lvbiA8IENVUlJFTlRfTUlOT1JfVkVSU0lPTikgeworICAgICAgICB1cGdyYWRlX2NyeXB0X2Z0cihmZCwgY3J5cHRfZnRyLCBzdGFydGluZ19vZmYpOworICAgIH0KIAotICAvKiBJZiB0aGlzIGlzIGEgdmVyaW9uIDEuMCBjcnlwdF9mdHIsIG1ha2UgaXQgYSAxLjEgY3J5cHQgZm9vdGVyLCBhbmQgdXBkYXRlIHRoZQotICAgKiBjb3B5IG9uIGRpc2sgYmVmb3JlIHJldHVybmluZy4KLSAgICovCi0gIGlmIChjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24gPCBDVVJSRU5UX01JTk9SX1ZFUlNJT04pIHsKLSAgICB1cGdyYWRlX2NyeXB0X2Z0cihmZCwgY3J5cHRfZnRyLCBzdGFydGluZ19vZmYpOwotICB9Ci0KLSAgLyogU3VjY2VzcyEgKi8KLSAgcmMgPSAwOworICAgIC8qIFN1Y2Nlc3MhICovCisgICAgcmMgPSAwOwogCiBlcnJvdXQ6Ci0gIGNsb3NlKGZkKTsKLSAgcmV0dXJuIHJjOworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgdmFsaWRhdGVfcGVyc2lzdGVudF9kYXRhX3N0b3JhZ2Uoc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikKLXsKK3N0YXRpYyBpbnQgdmFsaWRhdGVfcGVyc2lzdGVudF9kYXRhX3N0b3JhZ2Uoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgewogICAgIGlmIChjcnlwdF9mdHItPnBlcnNpc3RfZGF0YV9vZmZzZXRbMF0gKyBjcnlwdF9mdHItPnBlcnNpc3RfZGF0YV9zaXplID4KICAgICAgICAgY3J5cHRfZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdKSB7CiAgICAgICAgIFNMT0dFKCJDcnlwdF9mdHIgcGVyc2lzdCBkYXRhIHJlZ2lvbnMgb3ZlcmxhcCIpOwpAQCAtNzU0LDcgKzcyOSw3IEBACiAgICAgfQogCiAgICAgaWYgKCgoY3J5cHRfZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdICsgY3J5cHRfZnRyLT5wZXJzaXN0X2RhdGFfc2l6ZSkgLQotICAgICAgICAoY3J5cHRfZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdIC0gQ1JZUFRfRk9PVEVSX1RPX1BFUlNJU1RfT0ZGU0VUKSkgPgorICAgICAgICAgKGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX29mZnNldFswXSAtIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVCkpID4KICAgICAgICAgQ1JZUFRfRk9PVEVSX09GRlNFVCkgewogICAgICAgICBTTE9HRSgiUGVyc2lzdGVudCBkYXRhIGV4dGVuZHMgcGFzdCBjcnlwdG8gZm9vdGVyIik7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTc2MywxMiArNzM4LDExIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbG9hZF9wZXJzaXN0ZW50X2RhdGEodm9pZCkKLXsKK3N0YXRpYyBpbnQgbG9hZF9wZXJzaXN0ZW50X2RhdGEodm9pZCkgewogICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKLSAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhICpwZGF0YSA9IE5VTEw7CisgICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSogcGRhdGEgPSBOVUxMOwogICAgIGNoYXIgZW5jcnlwdGVkX3N0YXRlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgY2hhciAqZm5hbWU7CisgICAgY2hhciogZm5hbWU7CiAgICAgaW50IGZvdW5kID0gMDsKICAgICBpbnQgZmQ7CiAgICAgaW50IHJldDsKQEAgLTc3OSwxMCArNzUzLDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0KICAgICAvKiBJZiBub3QgZW5jcnlwdGVkLCBqdXN0IGFsbG9jYXRlIGFuIGVtcHR5IHRhYmxlIGFuZCBpbml0aWFsaXplIGl0ICovCiAgICAgcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8uc3RhdGUiLCBlbmNyeXB0ZWRfc3RhdGUsICIiKTsKLSAgICBpZiAoc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpICkgeworICAgIGlmIChzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikpIHsKICAgICAgICAgcGRhdGEgPSAoY3J5cHRfcGVyc2lzdF9kYXRhKiltYWxsb2MoQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOwogICAgICAgICBpZiAocGRhdGEpIHsKICAgICAgICAgICAgIGluaXRfZW1wdHlfcGVyc2lzdF9kYXRhKHBkYXRhLCBDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7CkBAIC03OTIsMTIgKzc2NSwxMiBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpKSB7CisgICAgaWYgKGdldF9jcnlwdF9mdHJfYW5kX2tleSgmY3J5cHRfZnRyKSkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA8IDEpCi0gICAgICAgIHx8IChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA9PSAxICYmIGNyeXB0X2Z0ci5taW5vcl92ZXJzaW9uIDwgMSkpIHsKKyAgICBpZiAoKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uIDwgMSkgfHwKKyAgICAgICAgKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uID09IDEgJiYgY3J5cHRfZnRyLm1pbm9yX3ZlcnNpb24gPCAxKSkgewogICAgICAgICBTTE9HRSgiQ3J5cHRfZnRyIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IHBlcnNpc3RlbnQgZGF0YSIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtODExLDcgKzc4NCw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZfE9fQ0xPRVhFQyk7CisgICAgZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWSB8IE9fQ0xPRVhFQyk7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICBTTE9HRSgiQ2Fubm90IG9wZW4gJXMgbWV0YWRhdGEgZmlsZSIsIGZuYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtODI4LDcgKzgwMSw3IEBACiAgICAgICAgICAgICBTTE9HRSgiQ2Fubm90IHNlZWsgdG8gcmVhZCBwZXJzaXN0ZW50IGRhdGEgb24gJXMiLCBmbmFtZSk7CiAgICAgICAgICAgICBnb3RvIGVycjI7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHVuaXhfcmVhZChmZCwgcGRhdGEsIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgPCAwKXsKKyAgICAgICAgaWYgKHVuaXhfcmVhZChmZCwgcGRhdGEsIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgPCAwKSB7CiAgICAgICAgICAgICBTTE9HRSgiRXJyb3IgcmVhZGluZyBwZXJzaXN0ZW50IGRhdGEgb24gaXRlcmF0aW9uICVkIiwgaSk7CiAgICAgICAgICAgICBnb3RvIGVycjI7CiAgICAgICAgIH0KQEAgLTg1NiwxMSArODI5LDEwIEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IHNhdmVfcGVyc2lzdGVudF9kYXRhKHZvaWQpCi17CitzdGF0aWMgaW50IHNhdmVfcGVyc2lzdGVudF9kYXRhKHZvaWQpIHsKICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjcnlwdF9mdHI7Ci0gICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGE7Ci0gICAgY2hhciAqZm5hbWU7CisgICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSogcGRhdGE7CisgICAgY2hhciogZm5hbWU7CiAgICAgb2ZmNjRfdCB3cml0ZV9vZmZzZXQ7CiAgICAgb2ZmNjRfdCBlcmFzZV9vZmZzZXQ7CiAgICAgaW50IGZkOwpAQCAtODcxLDEyICs4NDMsMTIgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmKGdldF9jcnlwdF9mdHJfYW5kX2tleSgmY3J5cHRfZnRyKSkgeworICAgIGlmIChnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmICgoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPCAxKQotICAgICAgICB8fCAoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPT0gMSAmJiBjcnlwdF9mdHIubWlub3JfdmVyc2lvbiA8IDEpKSB7CisgICAgaWYgKChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA8IDEpIHx8CisgICAgICAgIChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA9PSAxICYmIGNyeXB0X2Z0ci5taW5vcl92ZXJzaW9uIDwgMSkpIHsKICAgICAgICAgU0xPR0UoIkNyeXB0X2Z0ciB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBwZXJzaXN0ZW50IGRhdGEiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTg5MCw3ICs4NjIsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgZmQgPSBvcGVuKGZuYW1lLCBPX1JEV1J8T19DTE9FWEVDKTsKKyAgICBmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICBTTE9HRSgiQ2Fubm90IG9wZW4gJXMgbWV0YWRhdGEgZmlsZSIsIGZuYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtOTA4LDIwICs4ODAsMjAgQEAKICAgICB9CiAKICAgICBpZiAodW5peF9yZWFkKGZkLCBwZGF0YSwgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSA8IDApIHsKLSAgICAgICAgICAgIFNMT0dFKCJFcnJvciByZWFkaW5nIHBlcnNpc3RlbnQgZGF0YSBiZWZvcmUgc2F2ZSIpOwotICAgICAgICAgICAgZ290byBlcnIyOworICAgICAgICBTTE9HRSgiRXJyb3IgcmVhZGluZyBwZXJzaXN0ZW50IGRhdGEgYmVmb3JlIHNhdmUiKTsKKyAgICAgICAgZ290byBlcnIyOwogICAgIH0KIAogICAgIGlmIChwZGF0YS0+cGVyc2lzdF9tYWdpYyA9PSBQRVJTSVNUX0RBVEFfTUFHSUMpIHsKICAgICAgICAgLyogVGhlIGZpcnN0IGNvcHkgaXMgdGhlIGN1cmVudCB2YWxpZCBjb3B5LCBzbyB3cml0ZSB0bwogICAgICAgICAgKiB0aGUgc2Vjb25kIGNvcHkgYW5kIGVyYXNlIHRoaXMgb25lICovCi0gICAgICAgd3JpdGVfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMV07Ci0gICAgICAgZXJhc2Vfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMF07CisgICAgICAgIHdyaXRlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdOworICAgICAgICBlcmFzZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFswXTsKICAgICB9IGVsc2UgewogICAgICAgICAvKiBUaGUgc2Vjb25kIGNvcHkgbXVzdCBiZSB0aGUgdmFsaWQgY29weSwgc28gd3JpdGUgdG8KICAgICAgICAgICogdGhlIGZpcnN0IGNvcHksIGFuZCBlcmFzZSB0aGUgc2Vjb25kICovCi0gICAgICAgd3JpdGVfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMF07Ci0gICAgICAgZXJhc2Vfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMV07CisgICAgICAgIHdyaXRlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdOworICAgICAgICBlcmFzZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFsxXTsKICAgICB9CiAKICAgICAvKiBXcml0ZSB0aGUgbmV3IGNvcHkgZmlyc3QsIGlmIHN1Y2Nlc3NmdWwsIHRoZW4gZXJhc2UgdGhlIG9sZCBjb3B5ICovCkBAIC05MzAsMTUgKzkwMiwxNCBAQAogICAgICAgICBnb3RvIGVycjI7CiAgICAgfQogICAgIGlmICh1bml4X3dyaXRlKGZkLCBwZXJzaXN0X2RhdGEsIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgPT0KLSAgICAgICAgKGludCkgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSB7CisgICAgICAgIChpbnQpY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSB7CiAgICAgICAgIGlmIChsc2VlazY0KGZkLCBlcmFzZV9vZmZzZXQsIFNFRUtfU0VUKSA8IDApIHsKICAgICAgICAgICAgIFNMT0dFKCJDYW5ub3Qgc2VlayB0byBlcmFzZSBwcmV2aW91cyBwZXJzaXN0ZW50IGRhdGEiKTsKICAgICAgICAgICAgIGdvdG8gZXJyMjsKICAgICAgICAgfQogICAgICAgICBmc3luYyhmZCk7CiAgICAgICAgIG1lbXNldChwZGF0YSwgMCwgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKTsKLSAgICAgICAgaWYgKHVuaXhfd3JpdGUoZmQsIHBkYXRhLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpICE9Ci0gICAgICAgICAgICAoaW50KSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpIHsKKyAgICAgICAgaWYgKHVuaXhfd3JpdGUoZmQsIHBkYXRhLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpICE9IChpbnQpY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSB7CiAgICAgICAgICAgICBTTE9HRSgiQ2Fubm90IHdyaXRlIHRvIGVyYXNlIHByZXZpb3VzIHBlcnNpc3RlbnQgZGF0YSIpOwogICAgICAgICAgICAgZ290byBlcnIyOwogICAgICAgICB9CkBAIC05NjMsODUgKzkzNCw4MiBAQAogLyogQ29udmVydCBhIGJpbmFyeSBrZXkgb2Ygc3BlY2lmaWVkIGxlbmd0aCBpbnRvIGFuIGFzY2lpIGhleCBzdHJpbmcgZXF1aXZhbGVudCwKICAqIHdpdGhvdXQgdGhlIGxlYWRpbmcgMHggYW5kIHdpdGggbnVsbCB0ZXJtaW5hdGlvbgogICovCi1zdGF0aWMgdm9pZCBjb252ZXJ0X2tleV90b19oZXhfYXNjaWkoY29uc3QgdW5zaWduZWQgY2hhciAqbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5c2l6ZSwgY2hhciAqbWFzdGVyX2tleV9hc2NpaSkgeworc3RhdGljIHZvaWQgY29udmVydF9rZXlfdG9faGV4X2FzY2lpKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG1hc3Rlcl9rZXksIHVuc2lnbmVkIGludCBrZXlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG1hc3Rlcl9rZXlfYXNjaWkpIHsKICAgICB1bnNpZ25lZCBpbnQgaSwgYTsKICAgICB1bnNpZ25lZCBjaGFyIG5pYmJsZTsKIAotICAgIGZvciAoaT0wLCBhPTA7IGk8a2V5c2l6ZTsgaSsrLCBhKz0yKSB7CisgICAgZm9yIChpID0gMCwgYSA9IDA7IGkgPCBrZXlzaXplOyBpKyssIGEgKz0gMikgewogICAgICAgICAvKiBGb3IgZWFjaCBieXRlLCB3cml0ZSBvdXQgdHdvIGFzY2lpIGhleCBkaWdpdHMgKi8KICAgICAgICAgbmliYmxlID0gKG1hc3Rlcl9rZXlbaV0gPj4gNCkgJiAweGY7CiAgICAgICAgIG1hc3Rlcl9rZXlfYXNjaWlbYV0gPSBuaWJibGUgKyAobmliYmxlID4gOSA/IDB4MzcgOiAweDMwKTsKIAogICAgICAgICBuaWJibGUgPSBtYXN0ZXJfa2V5W2ldICYgMHhmOwotICAgICAgICBtYXN0ZXJfa2V5X2FzY2lpW2ErMV0gPSBuaWJibGUgKyAobmliYmxlID4gOSA/IDB4MzcgOiAweDMwKTsKKyAgICAgICAgbWFzdGVyX2tleV9hc2NpaVthICsgMV0gPSBuaWJibGUgKyAobmliYmxlID4gOSA/IDB4MzcgOiAweDMwKTsKICAgICB9CiAKICAgICAvKiBBZGQgdGhlIG51bGwgdGVybWluYXRpb24gKi8KICAgICBtYXN0ZXJfa2V5X2FzY2lpW2FdID0gJ1wwJzsKLQogfQogCi1zdGF0aWMgaW50IGxvYWRfY3J5cHRvX21hcHBpbmdfdGFibGUoc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0ciwKLSAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWFzdGVyX2tleSwgY29uc3QgY2hhciAqcmVhbF9ibGtfbmFtZSwKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGZkLCBjb25zdCBjaGFyICpleHRyYV9wYXJhbXMpIHsKLSAgYWxpZ25hcyhzdHJ1Y3QgZG1faW9jdGwpIGNoYXIgYnVmZmVyW0RNX0NSWVBUX0JVRl9TSVpFXTsKLSAgc3RydWN0IGRtX2lvY3RsICppbzsKLSAgc3RydWN0IGRtX3RhcmdldF9zcGVjICp0Z3Q7Ci0gIGNoYXIgKmNyeXB0X3BhcmFtczsKLSAgLy8gV2UgbmVlZCB0d28gQVNDSUkgY2hhcmFjdGVycyB0byByZXByZXNlbnQgZWFjaCBieXRlLCBhbmQgbmVlZCBzcGFjZSBmb3IKLSAgLy8gdGhlICdcMCcgdGVybWluYXRvci4KLSAgY2hhciBtYXN0ZXJfa2V5X2FzY2lpW01BWF9LRVlfTEVOICogMiArIDFdOwotICBzaXplX3QgYnVmZl9vZmZzZXQ7Ci0gIGludCBpOworc3RhdGljIGludCBsb2FkX2NyeXB0b19tYXBwaW5nX3RhYmxlKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogbWFzdGVyX2tleSwgY29uc3QgY2hhciogcmVhbF9ibGtfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBpbnQgZmQsIGNvbnN0IGNoYXIqIGV4dHJhX3BhcmFtcykgeworICAgIGFsaWduYXMoc3RydWN0IGRtX2lvY3RsKSBjaGFyIGJ1ZmZlcltETV9DUllQVF9CVUZfU0laRV07CisgICAgc3RydWN0IGRtX2lvY3RsKiBpbzsKKyAgICBzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMqIHRndDsKKyAgICBjaGFyKiBjcnlwdF9wYXJhbXM7CisgICAgLy8gV2UgbmVlZCB0d28gQVNDSUkgY2hhcmFjdGVycyB0byByZXByZXNlbnQgZWFjaCBieXRlLCBhbmQgbmVlZCBzcGFjZSBmb3IKKyAgICAvLyB0aGUgJ1wwJyB0ZXJtaW5hdG9yLgorICAgIGNoYXIgbWFzdGVyX2tleV9hc2NpaVtNQVhfS0VZX0xFTiAqIDIgKyAxXTsKKyAgICBzaXplX3QgYnVmZl9vZmZzZXQ7CisgICAgaW50IGk7CiAKLSAgaW8gPSAoc3RydWN0IGRtX2lvY3RsICopIGJ1ZmZlcjsKKyAgICBpbyA9IChzdHJ1Y3QgZG1faW9jdGwqKWJ1ZmZlcjsKIAotICAvKiBMb2FkIHRoZSBtYXBwaW5nIHRhYmxlIGZvciB0aGlzIGRldmljZSAqLwotICB0Z3QgPSAoc3RydWN0IGRtX3RhcmdldF9zcGVjICopICZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOworICAgIC8qIExvYWQgdGhlIG1hcHBpbmcgdGFibGUgZm9yIHRoaXMgZGV2aWNlICovCisgICAgdGd0ID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyopJmJ1ZmZlcltzaXplb2Yoc3RydWN0IGRtX2lvY3RsKV07CiAKLSAgaW9jdGxfaW5pdChpbywgRE1fQ1JZUFRfQlVGX1NJWkUsIG5hbWUsIDApOwotICBpby0+dGFyZ2V0X2NvdW50ID0gMTsKLSAgdGd0LT5zdGF0dXMgPSAwOwotICB0Z3QtPnNlY3Rvcl9zdGFydCA9IDA7Ci0gIHRndC0+bGVuZ3RoID0gY3J5cHRfZnRyLT5mc19zaXplOwotICBzdHJsY3B5KHRndC0+dGFyZ2V0X3R5cGUsICJjcnlwdCIsIERNX01BWF9UWVBFX05BTUUpOworICAgIGlvY3RsX2luaXQoaW8sIERNX0NSWVBUX0JVRl9TSVpFLCBuYW1lLCAwKTsKKyAgICBpby0+dGFyZ2V0X2NvdW50ID0gMTsKKyAgICB0Z3QtPnN0YXR1cyA9IDA7CisgICAgdGd0LT5zZWN0b3Jfc3RhcnQgPSAwOworICAgIHRndC0+bGVuZ3RoID0gY3J5cHRfZnRyLT5mc19zaXplOworICAgIHN0cmxjcHkodGd0LT50YXJnZXRfdHlwZSwgImNyeXB0IiwgRE1fTUFYX1RZUEVfTkFNRSk7CiAKLSAgY3J5cHRfcGFyYW1zID0gYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKTsKLSAgY29udmVydF9rZXlfdG9faGV4X2FzY2lpKG1hc3Rlcl9rZXksIGNyeXB0X2Z0ci0+a2V5c2l6ZSwgbWFzdGVyX2tleV9hc2NpaSk7CisgICAgY3J5cHRfcGFyYW1zID0gYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKTsKKyAgICBjb252ZXJ0X2tleV90b19oZXhfYXNjaWkobWFzdGVyX2tleSwgY3J5cHRfZnRyLT5rZXlzaXplLCBtYXN0ZXJfa2V5X2FzY2lpKTsKIAotICBidWZmX29mZnNldCA9IGNyeXB0X3BhcmFtcyAtIGJ1ZmZlcjsKLSAgU0xPR0koIkV4dHJhIHBhcmFtZXRlcnMgZm9yIGRtX2NyeXB0OiAlc1xuIiwgZXh0cmFfcGFyYW1zKTsKLSAgc25wcmludGYoY3J5cHRfcGFyYW1zLCBzaXplb2YoYnVmZmVyKSAtIGJ1ZmZfb2Zmc2V0LCAiJXMgJXMgMCAlcyAwICVzIiwKLSAgICAgICAgICAgY3J5cHRfZnRyLT5jcnlwdG9fdHlwZV9uYW1lLCBtYXN0ZXJfa2V5X2FzY2lpLCByZWFsX2Jsa19uYW1lLAotICAgICAgICAgICBleHRyYV9wYXJhbXMpOwotICBjcnlwdF9wYXJhbXMgKz0gc3RybGVuKGNyeXB0X3BhcmFtcykgKyAxOwotICBjcnlwdF9wYXJhbXMgPSAoY2hhciAqKSAoKCh1bnNpZ25lZCBsb25nKWNyeXB0X3BhcmFtcyArIDcpICYgfjgpOyAvKiBBbGlnbiB0byBhbiA4IGJ5dGUgYm91bmRhcnkgKi8KLSAgdGd0LT5uZXh0ID0gY3J5cHRfcGFyYW1zIC0gYnVmZmVyOworICAgIGJ1ZmZfb2Zmc2V0ID0gY3J5cHRfcGFyYW1zIC0gYnVmZmVyOworICAgIFNMT0dJKCJFeHRyYSBwYXJhbWV0ZXJzIGZvciBkbV9jcnlwdDogJXNcbiIsIGV4dHJhX3BhcmFtcyk7CisgICAgc25wcmludGYoY3J5cHRfcGFyYW1zLCBzaXplb2YoYnVmZmVyKSAtIGJ1ZmZfb2Zmc2V0LCAiJXMgJXMgMCAlcyAwICVzIiwKKyAgICAgICAgICAgICBjcnlwdF9mdHItPmNyeXB0b190eXBlX25hbWUsIG1hc3Rlcl9rZXlfYXNjaWksIHJlYWxfYmxrX25hbWUsIGV4dHJhX3BhcmFtcyk7CisgICAgY3J5cHRfcGFyYW1zICs9IHN0cmxlbihjcnlwdF9wYXJhbXMpICsgMTsKKyAgICBjcnlwdF9wYXJhbXMgPQorICAgICAgICAoY2hhciopKCgodW5zaWduZWQgbG9uZyljcnlwdF9wYXJhbXMgKyA3KSAmIH44KTsgLyogQWxpZ24gdG8gYW4gOCBieXRlIGJvdW5kYXJ5ICovCisgICAgdGd0LT5uZXh0ID0gY3J5cHRfcGFyYW1zIC0gYnVmZmVyOwogCi0gIGZvciAoaSA9IDA7IGkgPCBUQUJMRV9MT0FEX1JFVFJJRVM7IGkrKykgewotICAgIGlmICghIGlvY3RsKGZkLCBETV9UQUJMRV9MT0FELCBpbykpIHsKLSAgICAgIGJyZWFrOworICAgIGZvciAoaSA9IDA7IGkgPCBUQUJMRV9MT0FEX1JFVFJJRVM7IGkrKykgeworICAgICAgICBpZiAoIWlvY3RsKGZkLCBETV9UQUJMRV9MT0FELCBpbykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVzbGVlcCg1MDAwMDApOwogICAgIH0KLSAgICB1c2xlZXAoNTAwMDAwKTsKLSAgfQogCi0gIGlmIChpID09IFRBQkxFX0xPQURfUkVUUklFUykgewotICAgIC8qIFdlIGZhaWxlZCB0byBsb2FkIHRoZSB0YWJsZSwgcmV0dXJuIGFuIGVycm9yICovCi0gICAgcmV0dXJuIC0xOwotICB9IGVsc2UgewotICAgIHJldHVybiBpICsgMTsKLSAgfQorICAgIGlmIChpID09IFRBQkxFX0xPQURfUkVUUklFUykgeworICAgICAgICAvKiBXZSBmYWlsZWQgdG8gbG9hZCB0aGUgdGFibGUsIHJldHVybiBhbiBlcnJvciAqLworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGkgKyAxOworICAgIH0KIH0KIAotCi1zdGF0aWMgaW50IGdldF9kbV9jcnlwdF92ZXJzaW9uKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSwgIGludCAqdmVyc2lvbikKLXsKK3N0YXRpYyBpbnQgZ2V0X2RtX2NyeXB0X3ZlcnNpb24oaW50IGZkLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQqIHZlcnNpb24pIHsKICAgICBjaGFyIGJ1ZmZlcltETV9DUllQVF9CVUZfU0laRV07Ci0gICAgc3RydWN0IGRtX2lvY3RsICppbzsKLSAgICBzdHJ1Y3QgZG1fdGFyZ2V0X3ZlcnNpb25zICp2OworICAgIHN0cnVjdCBkbV9pb2N0bCogaW87CisgICAgc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyogdjsKIAotICAgIGlvID0gKHN0cnVjdCBkbV9pb2N0bCAqKSBidWZmZXI7CisgICAgaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CiAKICAgICBpb2N0bF9pbml0KGlvLCBETV9DUllQVF9CVUZfU0laRSwgbmFtZSwgMCk7CiAKQEAgLTEwNTIsMTYgKzEwMjAsMTYgQEAKICAgICAvKiBJdGVyYXRlIG92ZXIgdGhlIHJldHVybmVkIHZlcnNpb25zLCBsb29raW5nIGZvciBuYW1lIG9mICJjcnlwdCIuCiAgICAgICogV2hlbiBmb3VuZCwgZ2V0IGFuZCByZXR1cm4gdGhlIHZlcnNpb24uCiAgICAgICovCi0gICAgdiA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3ZlcnNpb25zICopICZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOworICAgIHYgPSAoc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyopJmJ1ZmZlcltzaXplb2Yoc3RydWN0IGRtX2lvY3RsKV07CiAgICAgd2hpbGUgKHYtPm5leHQpIHsKLSAgICAgICAgaWYgKCEgc3RyY21wKHYtPm5hbWUsICJjcnlwdCIpKSB7CisgICAgICAgIGlmICghc3RyY21wKHYtPm5hbWUsICJjcnlwdCIpKSB7CiAgICAgICAgICAgICAvKiBXZSBmb3VuZCB0aGUgY3J5cHQgZHJpdmVyLCByZXR1cm4gdGhlIHZlcnNpb24sIGFuZCBnZXQgb3V0ICovCiAgICAgICAgICAgICB2ZXJzaW9uWzBdID0gdi0+dmVyc2lvblswXTsKICAgICAgICAgICAgIHZlcnNpb25bMV0gPSB2LT52ZXJzaW9uWzFdOwogICAgICAgICAgICAgdmVyc2lvblsyXSA9IHYtPnZlcnNpb25bMl07CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICB2ID0gKHN0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMgKikoKChjaGFyICopdikgKyB2LT5uZXh0KTsKKyAgICAgICAgdiA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3ZlcnNpb25zKikoKChjaGFyKil2KSArIHYtPm5leHQpOwogICAgIH0KIAogICAgIHJldHVybiAtMTsKQEAgLTExNDMsODcgKzExMTEsNzggQEAKICAgICByZXR2YWwgPSAwOwogCiBlcnJvdXQ6Ci0gIGNsb3NlKGZkKTsgICAvKiBJZiBmZCBpcyA8MCBmcm9tIGEgZmFpbGVkIG9wZW4gY2FsbCwgaXQncyBzYWZlIHRvIGp1c3QgaWdub3JlIHRoZSBjbG9zZSBlcnJvciAqLworICAgIGNsb3NlKGZkKTsgLyogSWYgZmQgaXMgPDAgZnJvbSBhIGZhaWxlZCBvcGVuIGNhbGwsIGl0J3Mgc2FmZSB0byBqdXN0IGlnbm9yZSB0aGUgY2xvc2UgZXJyb3IgKi8KIAotICByZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgZGVsZXRlX2NyeXB0b19ibGtfZGV2KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIGludCBmZDsKLSAgY2hhciBidWZmZXJbRE1fQ1JZUFRfQlVGX1NJWkVdOwotICBzdHJ1Y3QgZG1faW9jdGwgKmlvOwotICBpbnQgcmV0dmFsID0gLTE7CitzdGF0aWMgaW50IGRlbGV0ZV9jcnlwdG9fYmxrX2Rldihjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgaW50IGZkOworICAgIGNoYXIgYnVmZmVyW0RNX0NSWVBUX0JVRl9TSVpFXTsKKyAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvOworICAgIGludCByZXR2YWwgPSAtMTsKIAotICBpZiAoKGZkID0gb3BlbigiL2Rldi9kZXZpY2UtbWFwcGVyIiwgT19SRFdSfE9fQ0xPRVhFQykpIDwgMCApIHsKLSAgICBTTE9HRSgiQ2Fubm90IG9wZW4gZGV2aWNlLW1hcHBlclxuIik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICBpZiAoKGZkID0gb3BlbigiL2Rldi9kZXZpY2UtbWFwcGVyIiwgT19SRFdSIHwgT19DTE9FWEVDKSkgPCAwKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBkZXZpY2UtbWFwcGVyXG4iKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIGlvID0gKHN0cnVjdCBkbV9pb2N0bCAqKSBidWZmZXI7CisgICAgaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CiAKLSAgaW9jdGxfaW5pdChpbywgRE1fQ1JZUFRfQlVGX1NJWkUsIG5hbWUsIDApOwotICBpZiAoaW9jdGwoZmQsIERNX0RFVl9SRU1PVkUsIGlvKSkgewotICAgIFNMT0dFKCJDYW5ub3QgcmVtb3ZlIGRtLWNyeXB0IGRldmljZVxuIik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICBpb2N0bF9pbml0KGlvLCBETV9DUllQVF9CVUZfU0laRSwgbmFtZSwgMCk7CisgICAgaWYgKGlvY3RsKGZkLCBETV9ERVZfUkVNT1ZFLCBpbykpIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCByZW1vdmUgZG0tY3J5cHQgZGV2aWNlXG4iKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIC8qIFdlIG1hZGUgaXQgaGVyZSB3aXRoIG5vIGVycm9ycy4gIFdvb3QhICovCi0gIHJldHZhbCA9IDA7CisgICAgLyogV2UgbWFkZSBpdCBoZXJlIHdpdGggbm8gZXJyb3JzLiAgV29vdCEgKi8KKyAgICByZXR2YWwgPSAwOwogCiBlcnJvdXQ6Ci0gIGNsb3NlKGZkKTsgICAgLyogSWYgZmQgaXMgPDAgZnJvbSBhIGZhaWxlZCBvcGVuIGNhbGwsIGl0J3Mgc2FmZSB0byBqdXN0IGlnbm9yZSB0aGUgY2xvc2UgZXJyb3IgKi8KKyAgICBjbG9zZShmZCk7IC8qIElmIGZkIGlzIDwwIGZyb20gYSBmYWlsZWQgb3BlbiBjYWxsLCBpdCdzIHNhZmUgdG8ganVzdCBpZ25vcmUgdGhlIGNsb3NlIGVycm9yICovCiAKLSAgcmV0dXJuIHJldHZhbDsKLQorICAgIHJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgcGJrZGYyKGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlrZXksIHZvaWQgKnBhcmFtcyBVTlVTRUQpCi17CitzdGF0aWMgaW50IHBia2RmMihjb25zdCBjaGFyKiBwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNhbHQsIHVuc2lnbmVkIGNoYXIqIGlrZXksCisgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbXMgVU5VU0VEKSB7CiAgICAgU0xPR0koIlVzaW5nIHBia2RmMiBmb3IgY3J5cHRmcyBLREYiKTsKIAogICAgIC8qIFR1cm4gdGhlIHBhc3N3b3JkIGludG8gYSBrZXkgYW5kIElWIHRoYXQgY2FuIGRlY3J5cHQgdGhlIG1hc3RlciBrZXkgKi8KLSAgICByZXR1cm4gUEtDUzVfUEJLREYyX0hNQUNfU0hBMShwYXNzd2QsIHN0cmxlbihwYXNzd2QpLCBzYWx0LCBTQUxUX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQVNIX0NPVU5ULCBJTlRFUk1FRElBVEVfQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWtleSkgIT0gMTsKKyAgICByZXR1cm4gUEtDUzVfUEJLREYyX0hNQUNfU0hBMShwYXNzd2QsIHN0cmxlbihwYXNzd2QpLCBzYWx0LCBTQUxUX0xFTiwgSEFTSF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFUk1FRElBVEVfQlVGX1NJWkUsIGlrZXkpICE9IDE7CiB9CiAKLXN0YXRpYyBpbnQgc2NyeXB0KGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlrZXksIHZvaWQgKnBhcmFtcykKLXsKK3N0YXRpYyBpbnQgc2NyeXB0KGNvbnN0IGNoYXIqIHBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciogc2FsdCwgdW5zaWduZWQgY2hhciogaWtleSwgdm9pZCogcGFyYW1zKSB7CiAgICAgU0xPR0koIlVzaW5nIHNjcnlwdCBmb3IgY3J5cHRmcyBLREYiKTsKIAotICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIgPSAoc3RydWN0IGNyeXB0X21udF9mdHIgKikgcGFyYW1zOworICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIgPSAoc3RydWN0IGNyeXB0X21udF9mdHIqKXBhcmFtczsKIAogICAgIGludCBOID0gMSA8PCBmdHItPk5fZmFjdG9yOwogICAgIGludCByID0gMSA8PCBmdHItPnJfZmFjdG9yOwogICAgIGludCBwID0gMSA8PCBmdHItPnBfZmFjdG9yOwogCiAgICAgLyogVHVybiB0aGUgcGFzc3dvcmQgaW50byBhIGtleSBhbmQgSVYgdGhhdCBjYW4gZGVjcnlwdCB0aGUgbWFzdGVyIGtleSAqLwotICAgIGNyeXB0b19zY3J5cHQoKGNvbnN0IHVpbnQ4X3QqKXBhc3N3ZCwgc3RybGVuKHBhc3N3ZCksCi0gICAgICAgICAgICAgICAgICBzYWx0LCBTQUxUX0xFTiwgTiwgciwgcCwgaWtleSwKKyAgICBjcnlwdG9fc2NyeXB0KChjb25zdCB1aW50OF90KilwYXNzd2QsIHN0cmxlbihwYXNzd2QpLCBzYWx0LCBTQUxUX0xFTiwgTiwgciwgcCwgaWtleSwKICAgICAgICAgICAgICAgICAgIElOVEVSTUVESUFURV9CVUZfU0laRSk7CiAKLSAgIHJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNjcnlwdF9rZXltYXN0ZXIoY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlrZXksIHZvaWQgKnBhcmFtcykKLXsKK3N0YXRpYyBpbnQgc2NyeXB0X2tleW1hc3Rlcihjb25zdCBjaGFyKiBwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNhbHQsIHVuc2lnbmVkIGNoYXIqIGlrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW1zKSB7CiAgICAgU0xPR0koIlVzaW5nIHNjcnlwdCB3aXRoIGtleW1hc3RlciBmb3IgY3J5cHRmcyBLREYiKTsKIAogICAgIGludCByYzsKICAgICBzaXplX3Qgc2lnbmF0dXJlX3NpemU7CiAgICAgdW5zaWduZWQgY2hhciogc2lnbmF0dXJlOwotICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIgPSAoc3RydWN0IGNyeXB0X21udF9mdHIgKikgcGFyYW1zOworICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIgPSAoc3RydWN0IGNyeXB0X21udF9mdHIqKXBhcmFtczsKIAogICAgIGludCBOID0gMSA8PCBmdHItPk5fZmFjdG9yOwogICAgIGludCByID0gMSA8PCBmdHItPnJfZmFjdG9yOwogICAgIGludCBwID0gMSA8PCBmdHItPnBfZmFjdG9yOwogCi0gICAgcmMgPSBjcnlwdG9fc2NyeXB0KChjb25zdCB1aW50OF90KilwYXNzd2QsIHN0cmxlbihwYXNzd2QpLAotICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCBTQUxUX0xFTiwgTiwgciwgcCwgaWtleSwKKyAgICByYyA9IGNyeXB0b19zY3J5cHQoKGNvbnN0IHVpbnQ4X3QqKXBhc3N3ZCwgc3RybGVuKHBhc3N3ZCksIHNhbHQsIFNBTFRfTEVOLCBOLCByLCBwLCBpa2V5LAogICAgICAgICAgICAgICAgICAgICAgICBJTlRFUk1FRElBVEVfQlVGX1NJWkUpOwogCiAgICAgaWYgKHJjKSB7CkBAIC0xMjMxLDE0ICsxMTkwLDEzIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoa2V5bWFzdGVyX3NpZ25fb2JqZWN0KGZ0ciwgaWtleSwgSU5URVJNRURJQVRFX0JVRl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZSwgJnNpZ25hdHVyZV9zaXplKSkgeworICAgIGlmIChrZXltYXN0ZXJfc2lnbl9vYmplY3QoZnRyLCBpa2V5LCBJTlRFUk1FRElBVEVfQlVGX1NJWkUsICZzaWduYXR1cmUsICZzaWduYXR1cmVfc2l6ZSkpIHsKICAgICAgICAgU0xPR0UoIlNpZ25pbmcgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByYyA9IGNyeXB0b19zY3J5cHQoc2lnbmF0dXJlLCBzaWduYXR1cmVfc2l6ZSwgc2FsdCwgU0FMVF9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgIE4sIHIsIHAsIGlrZXksIElOVEVSTUVESUFURV9CVUZfU0laRSk7CisgICAgcmMgPSBjcnlwdG9fc2NyeXB0KHNpZ25hdHVyZSwgc2lnbmF0dXJlX3NpemUsIHNhbHQsIFNBTFRfTEVOLCBOLCByLCBwLCBpa2V5LAorICAgICAgICAgICAgICAgICAgICAgICBJTlRFUk1FRElBVEVfQlVGX1NJWkUpOwogICAgIGZyZWUoc2lnbmF0dXJlKTsKIAogICAgIGlmIChyYykgewpAQCAtMTI0OSwxMiArMTIwNywxMCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVuY3J5cHRfbWFzdGVyX2tleShjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkZWNyeXB0ZWRfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGlrZXlbSU5URVJNRURJQVRFX0JVRl9TSVpFXSA9IHsgMCB9Oworc3RhdGljIGludCBlbmNyeXB0X21hc3Rlcl9rZXkoY29uc3QgY2hhciogcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzYWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZGVjcnlwdGVkX21hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBlbmNyeXB0ZWRfbWFzdGVyX2tleSwgc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgeworICAgIHVuc2lnbmVkIGNoYXIgaWtleVtJTlRFUk1FRElBVEVfQlVGX1NJWkVdID0gezB9OwogICAgIEVWUF9DSVBIRVJfQ1RYIGVfY3R4OwogICAgIGludCBlbmNyeXB0ZWRfbGVuLCBmaW5hbF9sZW47CiAgICAgaW50IHJjID0gMDsKQEAgLTEyNjMsNDYgKzEyMTksNDYgQEAKICAgICBnZXRfZGV2aWNlX3NjcnlwdF9wYXJhbXMoY3J5cHRfZnRyKTsKIAogICAgIHN3aXRjaCAoY3J5cHRfZnRyLT5rZGZfdHlwZSkgewotICAgIGNhc2UgS0RGX1NDUllQVF9LRVlNQVNURVI6Ci0gICAgICAgIGlmIChrZXltYXN0ZXJfY3JlYXRlX2tleShjcnlwdF9mdHIpKSB7Ci0gICAgICAgICAgICBTTE9HRSgia2V5bWFzdGVyX2NyZWF0ZV9rZXkgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgY2FzZSBLREZfU0NSWVBUX0tFWU1BU1RFUjoKKyAgICAgICAgICAgIGlmIChrZXltYXN0ZXJfY3JlYXRlX2tleShjcnlwdF9mdHIpKSB7CisgICAgICAgICAgICAgICAgU0xPR0UoImtleW1hc3Rlcl9jcmVhdGVfa2V5IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBpZiAoc2NyeXB0X2tleW1hc3RlcihwYXNzd2QsIHNhbHQsIGlrZXksIGNyeXB0X2Z0cikpIHsKLSAgICAgICAgICAgIFNMT0dFKCJzY3J5cHQgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoc2NyeXB0X2tleW1hc3RlcihwYXNzd2QsIHNhbHQsIGlrZXksIGNyeXB0X2Z0cikpIHsKKyAgICAgICAgICAgICAgICBTTE9HRSgic2NyeXB0IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBLREZfU0NSWVBUOgotICAgICAgICBpZiAoc2NyeXB0KHBhc3N3ZCwgc2FsdCwgaWtleSwgY3J5cHRfZnRyKSkgewotICAgICAgICAgICAgU0xPR0UoInNjcnlwdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLREZfU0NSWVBUOgorICAgICAgICAgICAgaWYgKHNjcnlwdChwYXNzd2QsIHNhbHQsIGlrZXksIGNyeXB0X2Z0cikpIHsKKyAgICAgICAgICAgICAgICBTTE9HRSgic2NyeXB0IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgZGVmYXVsdDoKLSAgICAgICAgU0xPR0UoIkludmFsaWQga2RmX3R5cGUiKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU0xPR0UoIkludmFsaWQga2RmX3R5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKiBJbml0aWFsaXplIHRoZSBkZWNyeXB0aW9uIGVuZ2luZSAqLwogICAgIEVWUF9DSVBIRVJfQ1RYX2luaXQoJmVfY3R4KTsKLSAgICBpZiAoISBFVlBfRW5jcnlwdEluaXRfZXgoJmVfY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwgaWtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWtleStJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUykpIHsKKyAgICBpZiAoIUVWUF9FbmNyeXB0SW5pdF9leCgmZV9jdHgsIEVWUF9hZXNfMTI4X2NiYygpLCBOVUxMLCBpa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlrZXkgKyBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUykpIHsKICAgICAgICAgU0xPR0UoIkVWUF9FbmNyeXB0SW5pdCBmYWlsZWRcbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCZlX2N0eCwgMCk7IC8qIFR1cm4gb2ZmIHBhZGRpbmcgYXMgb3VyIGRhdGEgaXMgYmxvY2sgYWxpZ25lZCAqLwogCiAgICAgLyogRW5jcnlwdCB0aGUgbWFzdGVyIGtleSAqLwotICAgIGlmICghIEVWUF9FbmNyeXB0VXBkYXRlKCZlX2N0eCwgZW5jcnlwdGVkX21hc3Rlcl9rZXksICZlbmNyeXB0ZWRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCBjcnlwdF9mdHItPmtleXNpemUpKSB7CisgICAgaWYgKCFFVlBfRW5jcnlwdFVwZGF0ZSgmZV9jdHgsIGVuY3J5cHRlZF9tYXN0ZXJfa2V5LCAmZW5jcnlwdGVkX2xlbiwgZGVjcnlwdGVkX21hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHItPmtleXNpemUpKSB7CiAgICAgICAgIFNMT0dFKCJFVlBfRW5jcnlwdFVwZGF0ZSBmYWlsZWRcbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmICghIEVWUF9FbmNyeXB0RmluYWxfZXgoJmVfY3R4LCBlbmNyeXB0ZWRfbWFzdGVyX2tleSArIGVuY3J5cHRlZF9sZW4sICZmaW5hbF9sZW4pKSB7CisgICAgaWYgKCFFVlBfRW5jcnlwdEZpbmFsX2V4KCZlX2N0eCwgZW5jcnlwdGVkX21hc3Rlcl9rZXkgKyBlbmNyeXB0ZWRfbGVuLCAmZmluYWxfbGVuKSkgewogICAgICAgICBTTE9HRSgiRVZQX0VuY3J5cHRGaW5hbCBmYWlsZWRcbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTMyMSwxMyArMTI3NywxMiBAQAogICAgIGludCByID0gMSA8PCBjcnlwdF9mdHItPnJfZmFjdG9yOwogICAgIGludCBwID0gMSA8PCBjcnlwdF9mdHItPnBfZmFjdG9yOwogCi0gICAgcmMgPSBjcnlwdG9fc2NyeXB0KGlrZXksIElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTLAotICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHItPnNhbHQsIHNpemVvZihjcnlwdF9mdHItPnNhbHQpLCBOLCByLCBwLAotICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHItPnNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksCisgICAgcmMgPSBjcnlwdG9fc2NyeXB0KGlrZXksIElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTLCBjcnlwdF9mdHItPnNhbHQsIHNpemVvZihjcnlwdF9mdHItPnNhbHQpLAorICAgICAgICAgICAgICAgICAgICAgICBOLCByLCBwLCBjcnlwdF9mdHItPnNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjcnlwdF9mdHItPnNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXkpKTsKIAogICAgIGlmIChyYykgewotICAgICAgU0xPR0UoImVuY3J5cHRfbWFzdGVyX2tleTogY3J5cHRvX3NjcnlwdCBmYWlsZWQiKTsKKyAgICAgICAgU0xPR0UoImVuY3J5cHRfbWFzdGVyX2tleTogY3J5cHRvX3NjcnlwdCBmYWlsZWQiKTsKICAgICB9CiAKICAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZlX2N0eCk7CkBAIC0xMzM1LDYwICsxMjkwLDU3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGVjcnlwdF9tYXN0ZXJfa2V5X2F1eChjb25zdCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKnNhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX21hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVjcnlwdGVkX21hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2RmX2Z1bmMga2RmLCB2b2lkICprZGZfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqKiBpbnRlcm1lZGlhdGVfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogaW50ZXJtZWRpYXRlX2tleV9zaXplKQotewotICB1bnNpZ25lZCBjaGFyIGlrZXlbSU5URVJNRURJQVRFX0JVRl9TSVpFXSA9IHsgMCB9OwotICBFVlBfQ0lQSEVSX0NUWCBkX2N0eDsKLSAgaW50IGRlY3J5cHRlZF9sZW4sIGZpbmFsX2xlbjsKK3N0YXRpYyBpbnQgZGVjcnlwdF9tYXN0ZXJfa2V5X2F1eChjb25zdCBjaGFyKiBwYXNzd2QsIHVuc2lnbmVkIGNoYXIqIHNhbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZW5jcnlwdGVkX21hc3Rlcl9rZXksIHNpemVfdCBrZXlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCBrZGZfZnVuYyBrZGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoga2RmX3BhcmFtcywgdW5zaWduZWQgY2hhcioqIGludGVybWVkaWF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBpbnRlcm1lZGlhdGVfa2V5X3NpemUpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGlrZXlbSU5URVJNRURJQVRFX0JVRl9TSVpFXSA9IHswfTsKKyAgICBFVlBfQ0lQSEVSX0NUWCBkX2N0eDsKKyAgICBpbnQgZGVjcnlwdGVkX2xlbiwgZmluYWxfbGVuOwogCi0gIC8qIFR1cm4gdGhlIHBhc3N3b3JkIGludG8gYW4gaW50ZXJtZWRpYXRlIGtleSBhbmQgSVYgdGhhdCBjYW4gZGVjcnlwdCB0aGUKLSAgICAgbWFzdGVyIGtleSAqLwotICBpZiAoa2RmKHBhc3N3ZCwgc2FsdCwgaWtleSwga2RmX3BhcmFtcykpIHsKLSAgICBTTE9HRSgia2RmIGZhaWxlZCIpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8qIEluaXRpYWxpemUgdGhlIGRlY3J5cHRpb24gZW5naW5lICovCi0gIEVWUF9DSVBIRVJfQ1RYX2luaXQoJmRfY3R4KTsKLSAgaWYgKCEgRVZQX0RlY3J5cHRJbml0X2V4KCZkX2N0eCwgRVZQX2Flc18xMjhfY2JjKCksIE5VTEwsIGlrZXksIGlrZXkrSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCZkX2N0eCwgMCk7IC8qIFR1cm4gb2ZmIHBhZGRpbmcgYXMgb3VyIGRhdGEgaXMgYmxvY2sgYWxpZ25lZCAqLwotICAvKiBEZWNyeXB0IHRoZSBtYXN0ZXIga2V5ICovCi0gIGlmICghIEVWUF9EZWNyeXB0VXBkYXRlKCZkX2N0eCwgZGVjcnlwdGVkX21hc3Rlcl9rZXksICZkZWNyeXB0ZWRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZF9tYXN0ZXJfa2V5LCBrZXlzaXplKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoISBFVlBfRGVjcnlwdEZpbmFsX2V4KCZkX2N0eCwgZGVjcnlwdGVkX21hc3Rlcl9rZXkgKyBkZWNyeXB0ZWRfbGVuLCAmZmluYWxfbGVuKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChkZWNyeXB0ZWRfbGVuICsgZmluYWxfbGVuICE9IHN0YXRpY19jYXN0PGludD4oa2V5c2l6ZSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKiBDb3B5IGludGVybWVkaWF0ZSBrZXkgaWYgbmVlZGVkIGJ5IHBhcmFtcyAqLwotICBpZiAoaW50ZXJtZWRpYXRlX2tleSAmJiBpbnRlcm1lZGlhdGVfa2V5X3NpemUpIHsKLSAgICAqaW50ZXJtZWRpYXRlX2tleSA9ICh1bnNpZ25lZCBjaGFyKikgbWFsbG9jKElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKTsKLSAgICBpZiAoKmludGVybWVkaWF0ZV9rZXkpIHsKLSAgICAgIG1lbWNweSgqaW50ZXJtZWRpYXRlX2tleSwgaWtleSwgSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpOwotICAgICAgKmludGVybWVkaWF0ZV9rZXlfc2l6ZSA9IElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTOworICAgIC8qIFR1cm4gdGhlIHBhc3N3b3JkIGludG8gYW4gaW50ZXJtZWRpYXRlIGtleSBhbmQgSVYgdGhhdCBjYW4gZGVjcnlwdCB0aGUKKyAgICAgICBtYXN0ZXIga2V5ICovCisgICAgaWYgKGtkZihwYXNzd2QsIHNhbHQsIGlrZXksIGtkZl9wYXJhbXMpKSB7CisgICAgICAgIFNMT0dFKCJrZGYgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gIH0KIAotICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZkX2N0eCk7CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGVjcnlwdGlvbiBlbmdpbmUgKi8KKyAgICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZkX2N0eCk7CisgICAgaWYgKCFFVlBfRGVjcnlwdEluaXRfZXgoJmRfY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwgaWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpa2V5ICsgSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoJmRfY3R4LCAwKTsgLyogVHVybiBvZmYgcGFkZGluZyBhcyBvdXIgZGF0YSBpcyBibG9jayBhbGlnbmVkICovCisgICAgLyogRGVjcnlwdCB0aGUgbWFzdGVyIGtleSAqLworICAgIGlmICghRVZQX0RlY3J5cHRVcGRhdGUoJmRfY3R4LCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgJmRlY3J5cHRlZF9sZW4sIGVuY3J5cHRlZF9tYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIUVWUF9EZWNyeXB0RmluYWxfZXgoJmRfY3R4LCBkZWNyeXB0ZWRfbWFzdGVyX2tleSArIGRlY3J5cHRlZF9sZW4sICZmaW5hbF9sZW4pKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLSAgcmV0dXJuIDA7CisgICAgaWYgKGRlY3J5cHRlZF9sZW4gKyBmaW5hbF9sZW4gIT0gc3RhdGljX2Nhc3Q8aW50PihrZXlzaXplKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQ29weSBpbnRlcm1lZGlhdGUga2V5IGlmIG5lZWRlZCBieSBwYXJhbXMgKi8KKyAgICBpZiAoaW50ZXJtZWRpYXRlX2tleSAmJiBpbnRlcm1lZGlhdGVfa2V5X3NpemUpIHsKKyAgICAgICAgKmludGVybWVkaWF0ZV9rZXkgPSAodW5zaWduZWQgY2hhciopbWFsbG9jKElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKTsKKyAgICAgICAgaWYgKCppbnRlcm1lZGlhdGVfa2V5KSB7CisgICAgICAgICAgICBtZW1jcHkoKmludGVybWVkaWF0ZV9rZXksIGlrZXksIElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKTsKKyAgICAgICAgICAgICppbnRlcm1lZGlhdGVfa2V5X3NpemUgPSBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmRfY3R4KTsKKworICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBnZXRfa2RmX2Z1bmMoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0ciwga2RmX2Z1bmMgKmtkZiwgdm9pZCoqIGtkZl9wYXJhbXMpCi17CitzdGF0aWMgdm9pZCBnZXRfa2RmX2Z1bmMoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0ciwga2RmX2Z1bmMqIGtkZiwgdm9pZCoqIGtkZl9wYXJhbXMpIHsKICAgICBpZiAoZnRyLT5rZGZfdHlwZSA9PSBLREZfU0NSWVBUX0tFWU1BU1RFUikgewogICAgICAgICAqa2RmID0gc2NyeXB0X2tleW1hc3RlcjsKICAgICAgICAgKmtkZl9wYXJhbXMgPSBmdHI7CkBAIC0xNDAxLDIwICsxMzUzLDE3IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IGRlY3J5cHRfbWFzdGVyX2tleShjb25zdCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKmRlY3J5cHRlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqKiBpbnRlcm1lZGlhdGVfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBpbnRlcm1lZGlhdGVfa2V5X3NpemUpCi17CitzdGF0aWMgaW50IGRlY3J5cHRfbWFzdGVyX2tleShjb25zdCBjaGFyKiBwYXNzd2QsIHVuc2lnbmVkIGNoYXIqIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0ciwgdW5zaWduZWQgY2hhcioqIGludGVybWVkaWF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGludGVybWVkaWF0ZV9rZXlfc2l6ZSkgewogICAgIGtkZl9mdW5jIGtkZjsKLSAgICB2b2lkICprZGZfcGFyYW1zOworICAgIHZvaWQqIGtkZl9wYXJhbXM7CiAgICAgaW50IHJldDsKIAogICAgIGdldF9rZGZfZnVuYyhjcnlwdF9mdHIsICZrZGYsICZrZGZfcGFyYW1zKTsKLSAgICByZXQgPSBkZWNyeXB0X21hc3Rlcl9rZXlfYXV4KHBhc3N3ZCwgY3J5cHRfZnRyLT5zYWx0LCBjcnlwdF9mdHItPm1hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHItPmtleXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ZWRfbWFzdGVyX2tleSwga2RmLCBrZGZfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX2tleSwgaW50ZXJtZWRpYXRlX2tleV9zaXplKTsKKyAgICByZXQgPSBkZWNyeXB0X21hc3Rlcl9rZXlfYXV4KHBhc3N3ZCwgY3J5cHRfZnRyLT5zYWx0LCBjcnlwdF9mdHItPm1hc3Rlcl9rZXksIGNyeXB0X2Z0ci0+a2V5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCBrZGYsIGtkZl9wYXJhbXMsIGludGVybWVkaWF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfa2V5X3NpemUpOwogICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgICBTTE9HVygiZmFpbHVyZSBkZWNyeXB0aW5nIG1hc3RlciBrZXkiKTsKICAgICB9CkBAIC0xNDIyLDEzICsxMzcxLDEzIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBjcmVhdGVfZW5jcnlwdGVkX3JhbmRvbV9rZXkoY29uc3QgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICptYXN0ZXJfa2V5LCB1bnNpZ25lZCBjaGFyICpzYWx0LAotICAgICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyKSB7CitzdGF0aWMgaW50IGNyZWF0ZV9lbmNyeXB0ZWRfcmFuZG9tX2tleShjb25zdCBjaGFyKiBwYXNzd2QsIHVuc2lnbmVkIGNoYXIqIG1hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzYWx0LCBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyKSB7CiAgICAgaW50IGZkOwogICAgIHVuc2lnbmVkIGNoYXIga2V5X2J1ZltNQVhfS0VZX0xFTl07CiAKICAgICAvKiBHZXQgc29tZSByYW5kb20gYml0cyBmb3IgYSBrZXkgKi8KLSAgICBmZCA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZfE9fQ0xPRVhFQyk7CisgICAgZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSB8IE9fQ0xPRVhFQyk7CiAgICAgcmVhZChmZCwga2V5X2J1Ziwgc2l6ZW9mKGtleV9idWYpKTsKICAgICByZWFkKGZkLCBzYWx0LCBTQUxUX0xFTik7CiAgICAgY2xvc2UoZmQpOwpAQCAtMTQzNywxMyArMTM4NiwxMiBAQAogICAgIHJldHVybiBlbmNyeXB0X21hc3Rlcl9rZXkocGFzc3dkLCBzYWx0LCBrZXlfYnVmLCBtYXN0ZXJfa2V5LCBjcnlwdF9mdHIpOwogfQogCi1pbnQgd2FpdF9hbmRfdW5tb3VudChjb25zdCBjaGFyICptb3VudHBvaW50LCBib29sIGtpbGwpCi17CitpbnQgd2FpdF9hbmRfdW5tb3VudChjb25zdCBjaGFyKiBtb3VudHBvaW50LCBib29sIGtpbGwpIHsKICAgICBpbnQgaSwgZXJyLCByYzsKICNkZWZpbmUgV0FJVF9VTk1PVU5UX0NPVU5UIDIwCiAKICAgICAvKiAgTm93IHVtb3VudCB0aGUgdG1wZnMgZmlsZXN5c3RlbSAqLwotICAgIGZvciAoaT0wOyBpPFdBSVRfVU5NT1VOVF9DT1VOVDsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IFdBSVRfVU5NT1VOVF9DT1VOVDsgaSsrKSB7CiAgICAgICAgIGlmICh1bW91bnQobW91bnRwb2ludCkgPT0gMCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE0NzIsMTkgKzE0MjAsMTggQEAKICAgICB9CiAKICAgICBpZiAoaSA8IFdBSVRfVU5NT1VOVF9DT1VOVCkgewotICAgICAgU0xPR0QoInVubW91bnRpbmcgJXMgc3VjY2VlZGVkXG4iLCBtb3VudHBvaW50KTsKLSAgICAgIHJjID0gMDsKKyAgICAgICAgU0xPR0QoInVubW91bnRpbmcgJXMgc3VjY2VlZGVkXG4iLCBtb3VudHBvaW50KTsKKyAgICAgICAgcmMgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICBhbmRyb2lkOjp2b2xkOjpLaWxsUHJvY2Vzc2VzV2l0aE9wZW5GaWxlcyhtb3VudHBvaW50LCAwKTsKLSAgICAgIFNMT0dFKCJ1bm1vdW50aW5nICVzIGZhaWxlZDogJXNcbiIsIG1vdW50cG9pbnQsIHN0cmVycm9yKGVycikpOwotICAgICAgcmMgPSAtMTsKKyAgICAgICAgYW5kcm9pZDo6dm9sZDo6S2lsbFByb2Nlc3Nlc1dpdGhPcGVuRmlsZXMobW91bnRwb2ludCwgMCk7CisgICAgICAgIFNMT0dFKCJ1bm1vdW50aW5nICVzIGZhaWxlZDogJXNcbiIsIG1vdW50cG9pbnQsIHN0cmVycm9yKGVycikpOworICAgICAgICByYyA9IC0xOwogICAgIH0KIAogICAgIHJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgcHJlcF9kYXRhX2ZzKHZvaWQpCi17CitzdGF0aWMgdm9pZCBwcmVwX2RhdGFfZnModm9pZCkgewogICAgIC8vIE5PVEU6IHBvc3RfZnNfZGF0YSByZXN1bHRzIGluIGluaXQgY2FsbGluZyBiYWNrIGFyb3VuZCB0byB2b2xkLCBzbyBhbGwKICAgICAvLyBjYWxsZXJzIHRvIHRoaXMgbWV0aG9kIG11c3QgYmUgYXN5bmMKIApAQCAtMTQ5NCwxNyArMTQ0MSwxNCBAQAogICAgIFNMT0dEKCJKdXN0IHRyaWdnZXJlZCBwb3N0X2ZzX2RhdGEiKTsKIAogICAgIC8qIFdhaXQgYSBtYXggb2YgNTAgc2Vjb25kcywgaG9wZWZ1bGx5IGl0IHRha2VzIG11Y2ggbGVzcyAqLwotICAgIHdoaWxlICghYW5kcm9pZDo6YmFzZTo6V2FpdEZvclByb3BlcnR5KCJ2b2xkLnBvc3RfZnNfZGF0YV9kb25lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnNlY29uZHMoMTUpKSkgeworICAgIHdoaWxlICghYW5kcm9pZDo6YmFzZTo6V2FpdEZvclByb3BlcnR5KCJ2b2xkLnBvc3RfZnNfZGF0YV9kb25lIiwgIjEiLCBzdGQ6OmNocm9ubzo6c2Vjb25kcygxNSkpKSB7CiAgICAgICAgIC8qIFdlIHRpbWVkIG91dCB0byBwcmVwIC9kYXRhIGluIHRpbWUuICBDb250aW51ZSB3YWl0LiAqLwogICAgICAgICBTTE9HRSgid2FpdGVkIDE1cyBmb3Igdm9sZC5wb3N0X2ZzX2RhdGFfZG9uZSwgc3RpbGwgd2FpdGluZy4uLiIpOwogICAgIH0KICAgICBTTE9HRCgicG9zdF9mc19kYXRhIGRvbmUiKTsKIH0KIAotc3RhdGljIHZvaWQgY3J5cHRmc19zZXRfY29ycnVwdCgpCi17CitzdGF0aWMgdm9pZCBjcnlwdGZzX3NldF9jb3JydXB0KCkgewogICAgIC8vIE1hcmsgdGhlIGZvb3RlciBhcyBiYWQKICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjcnlwdF9mdHI7CiAgICAgaWYgKGdldF9jcnlwdF9mdHJfYW5kX2tleSgmY3J5cHRfZnRyKSkgewpAQCAtMTUxOSwxMSArMTQ2MywxMCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY3J5cHRmc190cmlnZ2VyX3Jlc3RhcnRfbWluX2ZyYW1ld29yaygpCi17CitzdGF0aWMgdm9pZCBjcnlwdGZzX3RyaWdnZXJfcmVzdGFydF9taW5fZnJhbWV3b3JrKCkgewogICAgIGlmIChmc19tZ3JfZG9fdG1wZnNfbW91bnQoREFUQV9NTlRfUE9JTlQpKSB7Ci0gICAgICBTTE9HRSgiRmFpbGVkIHRvIG1vdW50IHRtcGZzIG9uIGRhdGEgLSBwYW5pYyIpOwotICAgICAgcmV0dXJuOworICAgICAgICBTTE9HRSgiRmFpbGVkIHRvIG1vdW50IHRtcGZzIG9uIGRhdGEgLSBwYW5pYyIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaWYgKHByb3BlcnR5X3NldCgidm9sZC5kZWNyeXB0IiwgInRyaWdnZXJfcG9zdF9mc19kYXRhIikpIHsKQEAgLTE1MzgsMTQgKzE0ODEsMTMgQEAKIH0KIAogLyogcmV0dXJucyA8IDAgb24gZmFpbHVyZSAqLwotc3RhdGljIGludCBjcnlwdGZzX3Jlc3RhcnRfaW50ZXJuYWwoaW50IHJlc3RhcnRfbWFpbikKLXsKK3N0YXRpYyBpbnQgY3J5cHRmc19yZXN0YXJ0X2ludGVybmFsKGludCByZXN0YXJ0X21haW4pIHsKICAgICBjaGFyIGNyeXB0b19ibGtkZXZbTUFYUEFUSExFTl07CiAgICAgaW50IHJjID0gLTE7CiAgICAgc3RhdGljIGludCByZXN0YXJ0X3N1Y2Nlc3NmdWwgPSAwOwogCiAgICAgLyogVmFsaWRhdGUgdGhhdCBpdCdzIE9LIHRvIGNhbGwgdGhpcyByb3V0aW5lICovCi0gICAgaWYgKCEgbWFzdGVyX2tleV9zYXZlZCkgeworICAgIGlmICghbWFzdGVyX2tleV9zYXZlZCkgewogICAgICAgICBTTE9HRSgiRW5jcnlwdGVkIGZpbGVzeXN0ZW0gbm90IHZhbGlkYXRlZCwgYWJvcnRpbmciKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTE1OTQsNyArMTUzNiw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoISAocmMgPSB3YWl0X2FuZF91bm1vdW50KERBVEFfTU5UX1BPSU5ULCB0cnVlKSkgKSB7CisgICAgaWYgKCEocmMgPSB3YWl0X2FuZF91bm1vdW50KERBVEFfTU5UX1BPSU5ULCB0cnVlKSkpIHsKICAgICAgICAgLyogSWYgcm8uY3J5cHRvLnJlYWRvbmx5IGlzIHNldCB0byAxLCBtb3VudCB0aGUgZGVjcnlwdGVkCiAgICAgICAgICAqIGZpbGVzeXN0ZW0gcmVhZG9ubHkuICBUaGlzIGlzIHVzZWQgd2hlbiAvZGF0YSBpcyBtb3VudGVkIGJ5CiAgICAgICAgICAqIHJlY292ZXJ5IG1vZGUuCkBAIC0xNjE2LDE5ICsxNTU4LDE2IEBACiAgICAgICAgICAqIGZzX21ncl9kb19tb3VudCBydW5zIGZzY2suIFVzZSBzZXRleGVjY29uIHRvIHJ1biB0cnVzdGVkCiAgICAgICAgICAqIHBhcnRpdGlvbnMgaW4gdGhlIGZzY2sgZG9tYWluLgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHNldGV4ZWNjb24oc2Vjb250ZXh0RnNjaygpKSl7CisgICAgICAgIGlmIChzZXRleGVjY29uKHNlY29udGV4dEZzY2soKSkpIHsKICAgICAgICAgICAgIFNMT0dFKCJGYWlsZWQgdG8gc2V0ZXhlY2NvbiIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgobW91bnRfcmMgPSBmc19tZ3JfZG9fbW91bnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvX2Jsa2RldiwgMCkpCi0gICAgICAgICAgICAgICAhPSAwKSB7CisgICAgICAgIHdoaWxlICgobW91bnRfcmMgPSBmc19tZ3JfZG9fbW91bnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQsIGNyeXB0b19ibGtkZXYsIDApKSAhPSAwKSB7CiAgICAgICAgICAgICBpZiAobW91bnRfcmMgPT0gRlNfTUdSX0RPTU5UX0JVU1kpIHsKICAgICAgICAgICAgICAgICAvKiBUT0RPOiBpbnZva2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8KICAgICAgICAgICAgICAgICAgICBQcm9jZXNzOjpraWxsUHJvY2Vzc1dpdGhPcGVuRmlsZXMoREFUQV9NTlRfUE9JTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXMgPiBSRVRSWV9NT1VOVF9BVFRFTVBULzIgPyAxIDogMiApICovCi0gICAgICAgICAgICAgICAgU0xPR0koIkZhaWxlZCB0byBtb3VudCAlcyBiZWNhdXNlIGl0IGlzIGJ1c3kgLSB3YWl0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICBjcnlwdG9fYmxrZGV2KTsKKyAgICAgICAgICAgICAgICBTTE9HSSgiRmFpbGVkIHRvIG1vdW50ICVzIGJlY2F1c2UgaXQgaXMgYnVzeSAtIHdhaXRpbmciLCBjcnlwdG9fYmxrZGV2KTsKICAgICAgICAgICAgICAgICBpZiAoLS1yZXRyaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgIHNsZWVwKFJFVFJZX01PVU5UX0RFTEFZX1NFQ09ORFMpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNjcxLDggKzE2MTAsNyBAQAogICAgIHJldHVybiByYzsKIH0KIAotaW50IGNyeXB0ZnNfcmVzdGFydCh2b2lkKQoteworaW50IGNyeXB0ZnNfcmVzdGFydCh2b2lkKSB7CiAgICAgU0xPR0koImNyeXB0ZnNfcmVzdGFydCIpOwogICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJjcnlwdGZzX3Jlc3RhcnQgbm90IHZhbGlkIGZvciBmaWxlIGVuY3J5cHRpb246Iik7CkBAIC0xNjgzLDE5MyArMTYyMSwxODkgQEAKICAgICByZXR1cm4gY3J5cHRmc19yZXN0YXJ0X2ludGVybmFsKDEpOwogfQogCi1zdGF0aWMgaW50IGRvX2NyeXB0b19jb21wbGV0ZShjb25zdCBjaGFyICptb3VudF9wb2ludCkKLXsKLSAgc3RydWN0IGNyeXB0X21udF9mdHIgY3J5cHRfZnRyOwotICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICBjaGFyIGtleV9sb2NbUFJPUEVSVFlfVkFMVUVfTUFYXTsKK3N0YXRpYyBpbnQgZG9fY3J5cHRvX2NvbXBsZXRlKGNvbnN0IGNoYXIqIG1vdW50X3BvaW50KSB7CisgICAgc3RydWN0IGNyeXB0X21udF9mdHIgY3J5cHRfZnRyOworICAgIGNoYXIgZW5jcnlwdGVkX3N0YXRlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgY2hhciBrZXlfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07CiAKLSAgcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8uc3RhdGUiLCBlbmNyeXB0ZWRfc3RhdGUsICIiKTsKLSAgaWYgKHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSApIHsKLSAgICBTTE9HRSgibm90IHJ1bm5pbmcgd2l0aCBlbmNyeXB0aW9uLCBhYm9ydGluZyIpOwotICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfTk9UX0VOQ1JZUFRFRDsKLSAgfQotCi0gIC8vIGNyeXB0b19jb21wbGV0ZSBpcyBmdWxsIGRpc2sgZW5jcnlwdGVkIHN0YXR1cwotICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgewotICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfTk9UX0VOQ1JZUFRFRDsKLSAgfQotCi0gIGlmIChnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKLSAgICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwga2V5X2xvYywgMCwgc2l6ZW9mKGtleV9sb2MpKTsKLQotICAgIC8qCi0gICAgICogT25seSByZXBvcnQgdGhpcyBlcnJvciBpZiBrZXlfbG9jIGlzIGEgZmlsZSBhbmQgaXQgZXhpc3RzLgotICAgICAqIElmIHRoZSBkZXZpY2Ugd2FzIG5ldmVyIGVuY3J5cHRlZCwgYW5kIC9kYXRhIGlzIG5vdCBtb3VudGFibGUgZm9yCi0gICAgICogc29tZSByZWFzb24sIHJldHVybmluZyAxIHNob3VsZCBwcmV2ZW50IHRoZSBVSSBmcm9tIHByZXNlbnRpbmcgdGhlCi0gICAgICogYSAiZW50ZXIgcGFzc3dvcmQiIHNjcmVlbiwgb3Igd29yc2UsIGEgInByZXNzIGJ1dHRvbiB0byB3aXBlIHRoZQotICAgICAqIGRldmljZSIgc2NyZWVuLgotICAgICAqLwotICAgIGlmICgoa2V5X2xvY1swXSA9PSAnLycpICYmIChhY2Nlc3MoImtleV9sb2MiLCBGX09LKSA9PSAtMSkpIHsKLSAgICAgIFNMT0dFKCJtYXN0ZXIga2V5IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFib3J0aW5nIik7Ci0gICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFNMT0dFKCJFcnJvciBnZXR0aW5nIGNyeXB0IGZvb3RlciBhbmQga2V5XG4iKTsKLSAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfQkFEX01FVEFEQVRBOworICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7CisgICAgaWYgKHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSkgeworICAgICAgICBTTE9HRSgibm90IHJ1bm5pbmcgd2l0aCBlbmNyeXB0aW9uLCBhYm9ydGluZyIpOworICAgICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQ7CiAgICAgfQotICB9CiAKLSAgLy8gVGVzdCBmb3IgcG9zc2libGUgZXJyb3IgZmxhZ3MKLSAgaWYgKGNyeXB0X2Z0ci5mbGFncyAmIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MpewotICAgIFNMT0dFKCJFbmNyeXB0aW9uIHByb2Nlc3MgaXMgcGFydHdheSBjb21wbGV0ZWRcbiIpOwotICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfUEFSVElBTDsKLSAgfQorICAgIC8vIGNyeXB0b19jb21wbGV0ZSBpcyBmdWxsIGRpc2sgZW5jcnlwdGVkIHN0YXR1cworICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfTk9UX0VOQ1JZUFRFRDsKKyAgICB9CiAKLSAgaWYgKGNyeXB0X2Z0ci5mbGFncyAmIENSWVBUX0lOQ09OU0lTVEVOVF9TVEFURSl7Ci0gICAgU0xPR0UoIkVuY3J5cHRpb24gcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnV0IGNhbm5vdCBjb250aW51ZVxuIik7Ci0gICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9JTkNPTlNJU1RFTlQ7Ci0gIH0KKyAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpKSB7CisgICAgICAgIGZzX21ncl9nZXRfY3J5cHRfaW5mbyhmc3RhYl9kZWZhdWx0LCBrZXlfbG9jLCAwLCBzaXplb2Yoa2V5X2xvYykpOwogCi0gIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9EQVRBX0NPUlJVUFQpewotICAgIFNMT0dFKCJFbmNyeXB0aW9uIGlzIHN1Y2Nlc3NmdWwgYnV0IGRhdGEgaXMgY29ycnVwdFxuIik7Ci0gICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9DT1JSVVBUOwotICB9CisgICAgICAgIC8qCisgICAgICAgICAqIE9ubHkgcmVwb3J0IHRoaXMgZXJyb3IgaWYga2V5X2xvYyBpcyBhIGZpbGUgYW5kIGl0IGV4aXN0cy4KKyAgICAgICAgICogSWYgdGhlIGRldmljZSB3YXMgbmV2ZXIgZW5jcnlwdGVkLCBhbmQgL2RhdGEgaXMgbm90IG1vdW50YWJsZSBmb3IKKyAgICAgICAgICogc29tZSByZWFzb24sIHJldHVybmluZyAxIHNob3VsZCBwcmV2ZW50IHRoZSBVSSBmcm9tIHByZXNlbnRpbmcgdGhlCisgICAgICAgICAqIGEgImVudGVyIHBhc3N3b3JkIiBzY3JlZW4sIG9yIHdvcnNlLCBhICJwcmVzcyBidXR0b24gdG8gd2lwZSB0aGUKKyAgICAgICAgICogZGV2aWNlIiBzY3JlZW4uCisgICAgICAgICAqLworICAgICAgICBpZiAoKGtleV9sb2NbMF0gPT0gJy8nKSAmJiAoYWNjZXNzKCJrZXlfbG9jIiwgRl9PSykgPT0gLTEpKSB7CisgICAgICAgICAgICBTTE9HRSgibWFzdGVyIGtleSBmaWxlIGRvZXMgbm90IGV4aXN0LCBhYm9ydGluZyIpOworICAgICAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU0xPR0UoIkVycm9yIGdldHRpbmcgY3J5cHQgZm9vdGVyIGFuZCBrZXlcbiIpOworICAgICAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9CQURfTUVUQURBVEE7CisgICAgICAgIH0KKyAgICB9CiAKLSAgLyogV2UgcGFzc2VkIHRoZSB0ZXN0ISBXZSBzaGFsbCBkaW1pbmlzaCwgYW5kIHJldHVybiB0byB0aGUgd2VzdCAqLwotICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0VOQ1JZUFRFRDsKKyAgICAvLyBUZXN0IGZvciBwb3NzaWJsZSBlcnJvciBmbGFncworICAgIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTKSB7CisgICAgICAgIFNMT0dFKCJFbmNyeXB0aW9uIHByb2Nlc3MgaXMgcGFydHdheSBjb21wbGV0ZWRcbiIpOworICAgICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX1BBUlRJQUw7CisgICAgfQorCisgICAgaWYgKGNyeXB0X2Z0ci5mbGFncyAmIENSWVBUX0lOQ09OU0lTVEVOVF9TVEFURSkgeworICAgICAgICBTTE9HRSgiRW5jcnlwdGlvbiBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBidXQgY2Fubm90IGNvbnRpbnVlXG4iKTsKKyAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9JTkNPTlNJU1RFTlQ7CisgICAgfQorCisgICAgaWYgKGNyeXB0X2Z0ci5mbGFncyAmIENSWVBUX0RBVEFfQ09SUlVQVCkgeworICAgICAgICBTTE9HRSgiRW5jcnlwdGlvbiBpcyBzdWNjZXNzZnVsIGJ1dCBkYXRhIGlzIGNvcnJ1cHRcbiIpOworICAgICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0NPUlJVUFQ7CisgICAgfQorCisgICAgLyogV2UgcGFzc2VkIHRoZSB0ZXN0ISBXZSBzaGFsbCBkaW1pbmlzaCwgYW5kIHJldHVybiB0byB0aGUgd2VzdCAqLworICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfRU5DUllQVEVEOwogfQogCi1zdGF0aWMgaW50IHRlc3RfbW91bnRfZW5jcnlwdGVkX2ZzKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgY2hhciAqbW91bnRfcG9pbnQsIGNvbnN0IGNoYXIgKmxhYmVsKQotewotICB1bnNpZ25lZCBjaGFyIGRlY3J5cHRlZF9tYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsKLSAgY2hhciBjcnlwdG9fYmxrZGV2W01BWFBBVEhMRU5dOwotICBjaGFyIHJlYWxfYmxrZGV2W01BWFBBVEhMRU5dOwotICBjaGFyIHRtcF9tb3VudF9wb2ludFs2NF07Ci0gIHVuc2lnbmVkIGludCBvcmlnX2ZhaWxlZF9kZWNyeXB0X2NvdW50OwotICBpbnQgcmM7Ci0gIGludCB1c2Vfa2V5bWFzdGVyID0gMDsKLSAgaW50IHVwZ3JhZGUgPSAwOwotICB1bnNpZ25lZCBjaGFyKiBpbnRlcm1lZGlhdGVfa2V5ID0gMDsKLSAgc2l6ZV90IGludGVybWVkaWF0ZV9rZXlfc2l6ZSA9IDA7Ci0gIGludCBOID0gMSA8PCBjcnlwdF9mdHItPk5fZmFjdG9yOwotICBpbnQgciA9IDEgPDwgY3J5cHRfZnRyLT5yX2ZhY3RvcjsKLSAgaW50IHAgPSAxIDw8IGNyeXB0X2Z0ci0+cF9mYWN0b3I7CitzdGF0aWMgaW50IHRlc3RfbW91bnRfZW5jcnlwdGVkX2ZzKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIsIGNvbnN0IGNoYXIqIHBhc3N3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbW91bnRfcG9pbnQsIGNvbnN0IGNoYXIqIGxhYmVsKSB7CisgICAgdW5zaWduZWQgY2hhciBkZWNyeXB0ZWRfbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07CisgICAgY2hhciBjcnlwdG9fYmxrZGV2W01BWFBBVEhMRU5dOworICAgIGNoYXIgcmVhbF9ibGtkZXZbTUFYUEFUSExFTl07CisgICAgY2hhciB0bXBfbW91bnRfcG9pbnRbNjRdOworICAgIHVuc2lnbmVkIGludCBvcmlnX2ZhaWxlZF9kZWNyeXB0X2NvdW50OworICAgIGludCByYzsKKyAgICBpbnQgdXNlX2tleW1hc3RlciA9IDA7CisgICAgaW50IHVwZ3JhZGUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIqIGludGVybWVkaWF0ZV9rZXkgPSAwOworICAgIHNpemVfdCBpbnRlcm1lZGlhdGVfa2V5X3NpemUgPSAwOworICAgIGludCBOID0gMSA8PCBjcnlwdF9mdHItPk5fZmFjdG9yOworICAgIGludCByID0gMSA8PCBjcnlwdF9mdHItPnJfZmFjdG9yOworICAgIGludCBwID0gMSA8PCBjcnlwdF9mdHItPnBfZmFjdG9yOwogCi0gIFNMT0dEKCJjcnlwdF9mdHItPmZzX3NpemUgPSAlbGxkXG4iLCBjcnlwdF9mdHItPmZzX3NpemUpOwotICBvcmlnX2ZhaWxlZF9kZWNyeXB0X2NvdW50ID0gY3J5cHRfZnRyLT5mYWlsZWRfZGVjcnlwdF9jb3VudDsKKyAgICBTTE9HRCgiY3J5cHRfZnRyLT5mc19zaXplID0gJWxsZFxuIiwgY3J5cHRfZnRyLT5mc19zaXplKTsKKyAgICBvcmlnX2ZhaWxlZF9kZWNyeXB0X2NvdW50ID0gY3J5cHRfZnRyLT5mYWlsZWRfZGVjcnlwdF9jb3VudDsKIAotICBpZiAoISAoY3J5cHRfZnRyLT5mbGFncyAmIENSWVBUX01OVF9LRVlfVU5FTkNSWVBURUQpICkgewotICAgIGlmIChkZWNyeXB0X21hc3Rlcl9rZXkocGFzc3dkLCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgY3J5cHRfZnRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybWVkaWF0ZV9rZXksICZpbnRlcm1lZGlhdGVfa2V5X3NpemUpKSB7Ci0gICAgICBTTE9HRSgiRmFpbGVkIHRvIGRlY3J5cHQgbWFzdGVyIGtleVxuIik7Ci0gICAgICByYyA9IC0xOwotICAgICAgZ290byBlcnJvdXQ7CisgICAgaWYgKCEoY3J5cHRfZnRyLT5mbGFncyAmIENSWVBUX01OVF9LRVlfVU5FTkNSWVBURUQpKSB7CisgICAgICAgIGlmIChkZWNyeXB0X21hc3Rlcl9rZXkocGFzc3dkLCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgY3J5cHRfZnRyLCAmaW50ZXJtZWRpYXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJtZWRpYXRlX2tleV9zaXplKSkgeworICAgICAgICAgICAgU0xPR0UoIkZhaWxlZCB0byBkZWNyeXB0IG1hc3RlciBrZXlcbiIpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3V0OworICAgICAgICB9CiAgICAgfQotICB9CiAKLSAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIDAsIHJlYWxfYmxrZGV2LCBzaXplb2YocmVhbF9ibGtkZXYpKTsKKyAgICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwgMCwgcmVhbF9ibGtkZXYsIHNpemVvZihyZWFsX2Jsa2RldikpOwogCi0gIC8vIENyZWF0ZSBjcnlwdG8gYmxvY2sgZGV2aWNlIC0gYWxsIChub24gZmF0YWwpIGNvZGUgcGF0aHMKLSAgLy8gbmVlZCBpdAotICBpZiAoY3JlYXRlX2NyeXB0b19ibGtfZGV2KGNyeXB0X2Z0ciwgZGVjcnlwdGVkX21hc3Rlcl9rZXksIHJlYWxfYmxrZGV2LCBjcnlwdG9fYmxrZGV2LCBsYWJlbCwgMCkpIHsKLSAgICAgIFNMT0dFKCJFcnJvciBjcmVhdGluZyBkZWNyeXB0ZWQgYmxvY2sgZGV2aWNlXG4iKTsKLSAgICAgIHJjID0gLTE7Ci0gICAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIC8vIENyZWF0ZSBjcnlwdG8gYmxvY2sgZGV2aWNlIC0gYWxsIChub24gZmF0YWwpIGNvZGUgcGF0aHMKKyAgICAvLyBuZWVkIGl0CisgICAgaWYgKGNyZWF0ZV9jcnlwdG9fYmxrX2RldihjcnlwdF9mdHIsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCByZWFsX2Jsa2RldiwgY3J5cHRvX2Jsa2RldiwgbGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkgeworICAgICAgICBTTE9HRSgiRXJyb3IgY3JlYXRpbmcgZGVjcnlwdGVkIGJsb2NrIGRldmljZVxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICAvKiBXb3JrIG91dCBpZiB0aGUgcHJvYmxlbSBpcyB0aGUgcGFzc3dvcmQgb3IgdGhlIGRhdGEgKi8KLSAgdW5zaWduZWQgY2hhciBzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5W3NpemVvZihjcnlwdF9mdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXkpXTsKKyAgICAvKiBXb3JrIG91dCBpZiB0aGUgcHJvYmxlbSBpcyB0aGUgcGFzc3dvcmQgb3IgdGhlIGRhdGEgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXlbc2l6ZW9mKGNyeXB0X2Z0ci0+c2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSldOwogCi0gIHJjID0gY3J5cHRvX3NjcnlwdChpbnRlcm1lZGlhdGVfa2V5LCBpbnRlcm1lZGlhdGVfa2V5X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHItPnNhbHQsIHNpemVvZihjcnlwdF9mdHItPnNhbHQpLAotICAgICAgICAgICAgICAgICAgICAgTiwgciwgcCwgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KSk7CisgICAgcmMgPSBjcnlwdG9fc2NyeXB0KGludGVybWVkaWF0ZV9rZXksIGludGVybWVkaWF0ZV9rZXlfc2l6ZSwgY3J5cHRfZnRyLT5zYWx0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY3J5cHRfZnRyLT5zYWx0KSwgTiwgciwgcCwgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXkpKTsKIAotICAvLyBEb2VzIHRoZSBrZXkgbWF0Y2ggdGhlIGNyeXB0byBmb290ZXI/Ci0gIGlmIChyYyA9PSAwICYmIG1lbWNtcChzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5zY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXkpKSA9PSAwKSB7Ci0gICAgU0xPR0koIlBhc3N3b3JkIG1hdGNoZXMiKTsKLSAgICByYyA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgLyogVHJ5IG1vdW50aW5nIHRoZSBmaWxlIHN5c3RlbSBhbnl3YXksIGp1c3QgaW4gY2FzZSB0aGUgcHJvYmxlbSdzIHdpdGgKLSAgICAgKiB0aGUgZm9vdGVyLCBub3QgdGhlIGtleS4gKi8KLSAgICBzbnByaW50Zih0bXBfbW91bnRfcG9pbnQsIHNpemVvZih0bXBfbW91bnRfcG9pbnQpLCAiJXMvdG1wX21udCIsCi0gICAgICAgICAgICAgbW91bnRfcG9pbnQpOwotICAgIG1rZGlyKHRtcF9tb3VudF9wb2ludCwgMDc1NSk7Ci0gICAgaWYgKGZzX21ncl9kb19tb3VudChmc3RhYl9kZWZhdWx0LCBEQVRBX01OVF9QT0lOVCwgY3J5cHRvX2Jsa2RldiwgdG1wX21vdW50X3BvaW50KSkgewotICAgICAgU0xPR0UoIkVycm9yIHRlbXAgbW91bnRpbmcgZGVjcnlwdGVkIGJsb2NrIGRldmljZVxuIik7Ci0gICAgICBkZWxldGVfY3J5cHRvX2Jsa19kZXYobGFiZWwpOwotCi0gICAgICByYyA9ICsrY3J5cHRfZnRyLT5mYWlsZWRfZGVjcnlwdF9jb3VudDsKLSAgICAgIHB1dF9jcnlwdF9mdHJfYW5kX2tleShjcnlwdF9mdHIpOworICAgIC8vIERvZXMgdGhlIGtleSBtYXRjaCB0aGUgY3J5cHRvIGZvb3Rlcj8KKyAgICBpZiAocmMgPT0gMCAmJiBtZW1jbXAoc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwgY3J5cHRfZnRyLT5zY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSkpID09IDApIHsKKyAgICAgICAgU0xPR0koIlBhc3N3b3JkIG1hdGNoZXMiKTsKKyAgICAgICAgcmMgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAvKiBTdWNjZXNzISAqLwotICAgICAgU0xPR0koIlBhc3N3b3JkIGRpZCBub3QgbWF0Y2ggYnV0IGRlY3J5cHRlZCBkcml2ZSBtb3VudGVkIC0gY29udGludWUiKTsKLSAgICAgIHVtb3VudCh0bXBfbW91bnRfcG9pbnQpOwotICAgICAgcmMgPSAwOwotICAgIH0KLSAgfQorICAgICAgICAvKiBUcnkgbW91bnRpbmcgdGhlIGZpbGUgc3lzdGVtIGFueXdheSwganVzdCBpbiBjYXNlIHRoZSBwcm9ibGVtJ3Mgd2l0aAorICAgICAgICAgKiB0aGUgZm9vdGVyLCBub3QgdGhlIGtleS4gKi8KKyAgICAgICAgc25wcmludGYodG1wX21vdW50X3BvaW50LCBzaXplb2YodG1wX21vdW50X3BvaW50KSwgIiVzL3RtcF9tbnQiLCBtb3VudF9wb2ludCk7CisgICAgICAgIG1rZGlyKHRtcF9tb3VudF9wb2ludCwgMDc1NSk7CisgICAgICAgIGlmIChmc19tZ3JfZG9fbW91bnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQsIGNyeXB0b19ibGtkZXYsIHRtcF9tb3VudF9wb2ludCkpIHsKKyAgICAgICAgICAgIFNMT0dFKCJFcnJvciB0ZW1wIG1vdW50aW5nIGRlY3J5cHRlZCBibG9jayBkZXZpY2VcbiIpOworICAgICAgICAgICAgZGVsZXRlX2NyeXB0b19ibGtfZGV2KGxhYmVsKTsKIAotICBpZiAocmMgPT0gMCkgewotICAgIGNyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQgPSAwOwotICAgIGlmIChvcmlnX2ZhaWxlZF9kZWNyeXB0X2NvdW50ICE9IDApIHsKLSAgICAgIHB1dF9jcnlwdF9mdHJfYW5kX2tleShjcnlwdF9mdHIpOwotICAgIH0KLQotICAgIC8qIFNhdmUgdGhlIG5hbWUgb2YgdGhlIGNyeXB0byBibG9jayBkZXZpY2UKLSAgICAgKiBzbyB3ZSBjYW4gbW91bnQgaXQgd2hlbiByZXN0YXJ0aW5nIHRoZSBmcmFtZXdvcmsuICovCi0gICAgcHJvcGVydHlfc2V0KCJyby5jcnlwdG8uZnNfY3J5cHRvX2Jsa2RldiIsIGNyeXB0b19ibGtkZXYpOwotCi0gICAgLyogQWxzbyBzYXZlIGEgdGhlIG1hc3RlciBrZXkgc28gd2UgY2FuIHJlZW5jcnlwdGVkIHRoZSBrZXkKLSAgICAgKiB0aGUga2V5IHdoZW4gd2Ugd2FudCB0byBjaGFuZ2UgdGhlIHBhc3N3b3JkIG9uIGl0LiAqLwotICAgIG1lbWNweShzYXZlZF9tYXN0ZXJfa2V5LCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgY3J5cHRfZnRyLT5rZXlzaXplKTsKLSAgICBzYXZlZF9tb3VudF9wb2ludCA9IHN0cmR1cChtb3VudF9wb2ludCk7Ci0gICAgbWFzdGVyX2tleV9zYXZlZCA9IDE7Ci0gICAgU0xPR0QoIiVzKCk6IE1hc3RlciBrZXkgc2F2ZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmMgPSAwOwotCi0gICAgLy8gVXBncmFkZSBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIGxhdGVzdCBLREYuCi0gICAgdXNlX2tleW1hc3RlciA9IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5KCk7Ci0gICAgaWYgKGNyeXB0X2Z0ci0+a2RmX3R5cGUgPT0gS0RGX1NDUllQVF9LRVlNQVNURVIpIHsKLSAgICAgICAgLy8gRG9uJ3QgYWxsb3cgZG93bmdyYWRlCi0gICAgfSBlbHNlIGlmICh1c2Vfa2V5bWFzdGVyID09IDEgJiYgY3J5cHRfZnRyLT5rZGZfdHlwZSAhPSBLREZfU0NSWVBUX0tFWU1BU1RFUikgewotICAgICAgICBjcnlwdF9mdHItPmtkZl90eXBlID0gS0RGX1NDUllQVF9LRVlNQVNURVI7Ci0gICAgICAgIHVwZ3JhZGUgPSAxOwotICAgIH0gZWxzZSBpZiAodXNlX2tleW1hc3RlciA9PSAwICYmIGNyeXB0X2Z0ci0+a2RmX3R5cGUgIT0gS0RGX1NDUllQVCkgewotICAgICAgICBjcnlwdF9mdHItPmtkZl90eXBlID0gS0RGX1NDUllQVDsKLSAgICAgICAgdXBncmFkZSA9IDE7Ci0gICAgfQotCi0gICAgaWYgKHVwZ3JhZGUpIHsKLSAgICAgICAgcmMgPSBlbmNyeXB0X21hc3Rlcl9rZXkocGFzc3dkLCBjcnlwdF9mdHItPnNhbHQsIHNhdmVkX21hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+bWFzdGVyX2tleSwgY3J5cHRfZnRyKTsKLSAgICAgICAgaWYgKCFyYykgewotICAgICAgICAgICAgcmMgPSBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoY3J5cHRfZnRyKTsKLSAgICAgICAgfQotICAgICAgICBTTE9HRCgiS2V5IERlcml2YXRpb24gRnVuY3Rpb24gdXBncmFkZTogcmM9JWRcbiIsIHJjKTsKLQotICAgICAgICAvLyBEbyBub3QgZmFpbCBldmVuIGlmIHVwZ3JhZGUgZmFpbGVkIC0gbWFjaGluZSBpcyBib290YWJsZQotICAgICAgICAvLyBOb3RlIHRoYXQgaWYgdGhpcyBjb2RlIGlzIGV2ZXIgaGl0LCB0aGVyZSBpcyBhICpzZXJpb3VzKiBwcm9ibGVtCi0gICAgICAgIC8vIHNpbmNlIEtERnMgc2hvdWxkIG5ldmVyIGZhaWwuIFlvdSAqbXVzdCogZml4IHRoZSBrZGYgYmVmb3JlCi0gICAgICAgIC8vIHByb2NlZWRpbmchCi0gICAgICAgIGlmIChyYykgewotICAgICAgICAgIFNMT0dXKCJVcGdyYWRlIGZhaWxlZCB3aXRoIGVycm9yICVkLCIKLSAgICAgICAgICAgICAgICAiIGJ1dCBjb250aW51aW5nIHdpdGggcHJldmlvdXMgc3RhdGUiLAotICAgICAgICAgICAgICAgIHJjKTsKLSAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICByYyA9ICsrY3J5cHRfZnRyLT5mYWlsZWRfZGVjcnlwdF9jb3VudDsKKyAgICAgICAgICAgIHB1dF9jcnlwdF9mdHJfYW5kX2tleShjcnlwdF9mdHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogU3VjY2VzcyEgKi8KKyAgICAgICAgICAgIFNMT0dJKCJQYXNzd29yZCBkaWQgbm90IG1hdGNoIGJ1dCBkZWNyeXB0ZWQgZHJpdmUgbW91bnRlZCAtIGNvbnRpbnVlIik7CisgICAgICAgICAgICB1bW91bnQodG1wX21vdW50X3BvaW50KTsKKyAgICAgICAgICAgIHJjID0gMDsKICAgICAgICAgfQogICAgIH0KLSAgfQogCi0gZXJyb3V0OgotICBpZiAoaW50ZXJtZWRpYXRlX2tleSkgewotICAgIG1lbXNldChpbnRlcm1lZGlhdGVfa2V5LCAwLCBpbnRlcm1lZGlhdGVfa2V5X3NpemUpOwotICAgIGZyZWUoaW50ZXJtZWRpYXRlX2tleSk7Ci0gIH0KLSAgcmV0dXJuIHJjOworICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgIGNyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQgPSAwOworICAgICAgICBpZiAob3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudCAhPSAwKSB7CisgICAgICAgICAgICBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoY3J5cHRfZnRyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNhdmUgdGhlIG5hbWUgb2YgdGhlIGNyeXB0byBibG9jayBkZXZpY2UKKyAgICAgICAgICogc28gd2UgY2FuIG1vdW50IGl0IHdoZW4gcmVzdGFydGluZyB0aGUgZnJhbWV3b3JrLiAqLworICAgICAgICBwcm9wZXJ0eV9zZXQoInJvLmNyeXB0by5mc19jcnlwdG9fYmxrZGV2IiwgY3J5cHRvX2Jsa2Rldik7CisKKyAgICAgICAgLyogQWxzbyBzYXZlIGEgdGhlIG1hc3RlciBrZXkgc28gd2UgY2FuIHJlZW5jcnlwdGVkIHRoZSBrZXkKKyAgICAgICAgICogdGhlIGtleSB3aGVuIHdlIHdhbnQgdG8gY2hhbmdlIHRoZSBwYXNzd29yZCBvbiBpdC4gKi8KKyAgICAgICAgbWVtY3B5KHNhdmVkX21hc3Rlcl9rZXksIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCBjcnlwdF9mdHItPmtleXNpemUpOworICAgICAgICBzYXZlZF9tb3VudF9wb2ludCA9IHN0cmR1cChtb3VudF9wb2ludCk7CisgICAgICAgIG1hc3Rlcl9rZXlfc2F2ZWQgPSAxOworICAgICAgICBTTE9HRCgiJXMoKTogTWFzdGVyIGtleSBzYXZlZFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmMgPSAwOworCisgICAgICAgIC8vIFVwZ3JhZGUgaWYgd2UncmUgbm90IHVzaW5nIHRoZSBsYXRlc3QgS0RGLgorICAgICAgICB1c2Vfa2V5bWFzdGVyID0ga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHkoKTsKKyAgICAgICAgaWYgKGNyeXB0X2Z0ci0+a2RmX3R5cGUgPT0gS0RGX1NDUllQVF9LRVlNQVNURVIpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGFsbG93IGRvd25ncmFkZQorICAgICAgICB9IGVsc2UgaWYgKHVzZV9rZXltYXN0ZXIgPT0gMSAmJiBjcnlwdF9mdHItPmtkZl90eXBlICE9IEtERl9TQ1JZUFRfS0VZTUFTVEVSKSB7CisgICAgICAgICAgICBjcnlwdF9mdHItPmtkZl90eXBlID0gS0RGX1NDUllQVF9LRVlNQVNURVI7CisgICAgICAgICAgICB1cGdyYWRlID0gMTsKKyAgICAgICAgfSBlbHNlIGlmICh1c2Vfa2V5bWFzdGVyID09IDAgJiYgY3J5cHRfZnRyLT5rZGZfdHlwZSAhPSBLREZfU0NSWVBUKSB7CisgICAgICAgICAgICBjcnlwdF9mdHItPmtkZl90eXBlID0gS0RGX1NDUllQVDsKKyAgICAgICAgICAgIHVwZ3JhZGUgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVwZ3JhZGUpIHsKKyAgICAgICAgICAgIHJjID0gZW5jcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgY3J5cHRfZnRyLT5zYWx0LCBzYXZlZF9tYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5tYXN0ZXJfa2V5LCBjcnlwdF9mdHIpOworICAgICAgICAgICAgaWYgKCFyYykgeworICAgICAgICAgICAgICAgIHJjID0gcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KGNyeXB0X2Z0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTTE9HRCgiS2V5IERlcml2YXRpb24gRnVuY3Rpb24gdXBncmFkZTogcmM9JWRcbiIsIHJjKTsKKworICAgICAgICAgICAgLy8gRG8gbm90IGZhaWwgZXZlbiBpZiB1cGdyYWRlIGZhaWxlZCAtIG1hY2hpbmUgaXMgYm9vdGFibGUKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpZiB0aGlzIGNvZGUgaXMgZXZlciBoaXQsIHRoZXJlIGlzIGEgKnNlcmlvdXMqIHByb2JsZW0KKyAgICAgICAgICAgIC8vIHNpbmNlIEtERnMgc2hvdWxkIG5ldmVyIGZhaWwuIFlvdSAqbXVzdCogZml4IHRoZSBrZGYgYmVmb3JlCisgICAgICAgICAgICAvLyBwcm9jZWVkaW5nIQorICAgICAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICAgICAgU0xPR1coCisgICAgICAgICAgICAgICAgICAgICJVcGdyYWRlIGZhaWxlZCB3aXRoIGVycm9yICVkLCIKKyAgICAgICAgICAgICAgICAgICAgIiBidXQgY29udGludWluZyB3aXRoIHByZXZpb3VzIHN0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworZXJyb3V0OgorICAgIGlmIChpbnRlcm1lZGlhdGVfa2V5KSB7CisgICAgICAgIG1lbXNldChpbnRlcm1lZGlhdGVfa2V5LCAwLCBpbnRlcm1lZGlhdGVfa2V5X3NpemUpOworICAgICAgICBmcmVlKGludGVybWVkaWF0ZV9rZXkpOworICAgIH0KKyAgICByZXR1cm4gcmM7CiB9CiAKIC8qCkBAIC0xODgwLDkgKzE4MTQsOSBAQAogICoKICAqIG91dF9jcnlwdG9fYmxrZGV2IG11c3QgYmUgTUFYUEFUSExFTi4KICAqLwotaW50IGNyeXB0ZnNfc2V0dXBfZXh0X3ZvbHVtZShjb25zdCBjaGFyKiBsYWJlbCwgY29uc3QgY2hhciogcmVhbF9ibGtkZXYsCi0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGtleSwgY2hhciogb3V0X2NyeXB0b19ibGtkZXYpIHsKLSAgICBpbnQgZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JET05MWXxPX0NMT0VYRUMpOworaW50IGNyeXB0ZnNfc2V0dXBfZXh0X3ZvbHVtZShjb25zdCBjaGFyKiBsYWJlbCwgY29uc3QgY2hhciogcmVhbF9ibGtkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogb3V0X2NyeXB0b19ibGtkZXYpIHsKKyAgICBpbnQgZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JET05MWSB8IE9fQ0xPRVhFQyk7CiAgICAgaWYgKGZkID09IC0xKSB7CiAgICAgICAgIFNMT0dFKCJGYWlsZWQgdG8gb3BlbiAlczogJXMiLCByZWFsX2Jsa2Rldiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTkwMSw3ICsxODM1LDcgQEAKICAgICBtZW1zZXQoJmV4dF9jcnlwdF9mdHIsIDAsIHNpemVvZihleHRfY3J5cHRfZnRyKSk7CiAgICAgZXh0X2NyeXB0X2Z0ci5mc19zaXplID0gbnJfc2VjOwogICAgIGV4dF9jcnlwdF9mdHIua2V5c2l6ZSA9IGNyeXB0ZnNfZ2V0X2tleXNpemUoKTsKLSAgICBzdHJsY3B5KChjaGFyKikgZXh0X2NyeXB0X2Z0ci5jcnlwdG9fdHlwZV9uYW1lLCBjcnlwdGZzX2dldF9jcnlwdG9fbmFtZSgpLAorICAgIHN0cmxjcHkoKGNoYXIqKWV4dF9jcnlwdF9mdHIuY3J5cHRvX3R5cGVfbmFtZSwgY3J5cHRmc19nZXRfY3J5cHRvX25hbWUoKSwKICAgICAgICAgICAgIE1BWF9DUllQVE9fVFlQRV9OQU1FX0xFTik7CiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpICYmCkBAIC0xOTE2LDIxICsxODUwLDIwIEBACiAgKiBzdG9yYWdlIHZvbHVtZS4KICAqLwogaW50IGNyeXB0ZnNfcmV2ZXJ0X2V4dF92b2x1bWUoY29uc3QgY2hhciogbGFiZWwpIHsKLSAgICByZXR1cm4gZGVsZXRlX2NyeXB0b19ibGtfZGV2KChjaGFyKikgbGFiZWwpOworICAgIHJldHVybiBkZWxldGVfY3J5cHRvX2Jsa19kZXYoKGNoYXIqKWxhYmVsKTsKIH0KIAotaW50IGNyeXB0ZnNfY3J5cHRvX2NvbXBsZXRlKHZvaWQpCi17Ci0gIHJldHVybiBkb19jcnlwdG9fY29tcGxldGUoIi9kYXRhIik7CitpbnQgY3J5cHRmc19jcnlwdG9fY29tcGxldGUodm9pZCkgeworICAgIHJldHVybiBkb19jcnlwdG9fY29tcGxldGUoIi9kYXRhIik7CiB9CiAKLWludCBjaGVja191bm1vdW50ZWRfYW5kX2dldF9mdHIoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikKLXsKK2ludCBjaGVja191bm1vdW50ZWRfYW5kX2dldF9mdHIoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgewogICAgIGNoYXIgZW5jcnlwdGVkX3N0YXRlW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8uc3RhdGUiLCBlbmNyeXB0ZWRfc3RhdGUsICIiKTsKLSAgICBpZiAoIG1hc3Rlcl9rZXlfc2F2ZWQgfHwgc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpICkgewotICAgICAgICBTTE9HRSgiZW5jcnlwdGVkIGZzIGFscmVhZHkgdmFsaWRhdGVkIG9yIG5vdCBydW5uaW5nIHdpdGggZW5jcnlwdGlvbiwiCi0gICAgICAgICAgICAgICIgYWJvcnRpbmciKTsKKyAgICBpZiAobWFzdGVyX2tleV9zYXZlZCB8fCBzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikpIHsKKyAgICAgICAgU0xPR0UoCisgICAgICAgICAgICAiZW5jcnlwdGVkIGZzIGFscmVhZHkgdmFsaWRhdGVkIG9yIG5vdCBydW5uaW5nIHdpdGggZW5jcnlwdGlvbiwiCisgICAgICAgICAgICAiIGFib3J0aW5nIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKQEAgLTE5NDIsOCArMTg3NSw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBjcnlwdGZzX2NoZWNrX3Bhc3N3ZChjb25zdCBjaGFyICpwYXNzd2QpCi17CitpbnQgY3J5cHRmc19jaGVja19wYXNzd2QoY29uc3QgY2hhciogcGFzc3dkKSB7CiAgICAgU0xPR0koImNyeXB0ZnNfY2hlY2tfcGFzc3dkIik7CiAgICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoImNyeXB0ZnNfY2hlY2tfcGFzc3dkIG5vdCB2YWxpZCBmb3IgZmlsZSBlbmNyeXB0aW9uIik7CkBAIC0xOTU5LDggKzE4OTEsNyBAQAogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCi0gICAgcmMgPSB0ZXN0X21vdW50X2VuY3J5cHRlZF9mcygmY3J5cHRfZnRyLCBwYXNzd2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX01OVF9QT0lOVCwgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CisgICAgcmMgPSB0ZXN0X21vdW50X2VuY3J5cHRlZF9mcygmY3J5cHRfZnRyLCBwYXNzd2QsIERBVEFfTU5UX1BPSU5ULCBDUllQVE9fQkxPQ0tfREVWSUNFKTsKICAgICBpZiAocmMpIHsKICAgICAgICAgU0xPR0UoIlBhc3N3b3JkIGRpZCBub3QgbWF0Y2giKTsKICAgICAgICAgcmV0dXJuIHJjOwpAQCAtMTk3Miw4ICsxOTAzLDggQEAKICAgICAgICAgLy8gRmlyc3QsIHdlIG11c3QgZGVsZXRlIHRoZSBjcnlwdG8gYmxvY2sgZGV2aWNlIHRoYXQKICAgICAgICAgLy8gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMgbGVhdmVzIGJlaGluZCBhcyBhIHNpZGUgZWZmZWN0CiAgICAgICAgIGRlbGV0ZV9jcnlwdG9fYmxrX2RldihDUllQVE9fQkxPQ0tfREVWSUNFKTsKLSAgICAgICAgcmMgPSB0ZXN0X21vdW50X2VuY3J5cHRlZF9mcygmY3J5cHRfZnRyLCBERUZBVUxUX1BBU1NXT1JELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfTU5UX1BPSU5ULCBDUllQVE9fQkxPQ0tfREVWSUNFKTsKKyAgICAgICAgcmMgPSB0ZXN0X21vdW50X2VuY3J5cHRlZF9mcygmY3J5cHRfZnRyLCBERUZBVUxUX1BBU1NXT1JELCBEQVRBX01OVF9QT0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fQkxPQ0tfREVWSUNFKTsKICAgICAgICAgaWYgKHJjKSB7CiAgICAgICAgICAgICBTTE9HRSgiRGVmYXVsdCBwYXNzd29yZCBkaWQgbm90IG1hdGNoIG9uIHJlYm9vdCBlbmNyeXB0aW9uIik7CiAgICAgICAgICAgICByZXR1cm4gcmM7CkBAIC0xOTk5LDE1ICsxOTMwLDE0IEBACiAgICAgcmV0dXJuIHJjOwogfQogCi1pbnQgY3J5cHRmc192ZXJpZnlfcGFzc3dkKGNvbnN0IGNoYXIgKnBhc3N3ZCkKLXsKK2ludCBjcnlwdGZzX3ZlcmlmeV9wYXNzd2QoY29uc3QgY2hhciogcGFzc3dkKSB7CiAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgY3J5cHRfZnRyOwogICAgIHVuc2lnbmVkIGNoYXIgZGVjcnlwdGVkX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwogICAgIGNoYXIgZW5jcnlwdGVkX3N0YXRlW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgaW50IHJjOwogCiAgICAgcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8uc3RhdGUiLCBlbmNyeXB0ZWRfc3RhdGUsICIiKTsKLSAgICBpZiAoc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpICkgeworICAgIGlmIChzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikpIHsKICAgICAgICAgU0xPR0UoImRldmljZSBub3QgZW5jcnlwdGVkLCBhYm9ydGluZyIpOwogICAgICAgICByZXR1cm4gLTI7CiAgICAgfQpAQCAtMjA1MCw4ICsxOTgwLDcgQEAKICAqIFByZXN1bWFibHksIGF0IGEgbWluaW11bSwgdGhlIGNhbGxlciB3aWxsIHVwZGF0ZSB0aGUKICAqIGZpbGVzeXN0ZW0gc2l6ZSBhbmQgY3J5cHRvX3R5cGVfbmFtZSBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQgY3J5cHRmc19pbml0X2NyeXB0X21udF9mdHIoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0cikKLXsKK3N0YXRpYyBpbnQgY3J5cHRmc19pbml0X2NyeXB0X21udF9mdHIoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0cikgewogICAgIG9mZjY0X3Qgb2ZmOwogCiAgICAgbWVtc2V0KGZ0ciwgMCwgc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSk7CkBAIC0yMDYyLDE3ICsxOTkxLDE3IEBACiAgICAgZnRyLT5rZXlzaXplID0gY3J5cHRmc19nZXRfa2V5c2l6ZSgpOwogCiAgICAgc3dpdGNoIChrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSgpKSB7Ci0gICAgY2FzZSAxOgotICAgICAgICBmdHItPmtkZl90eXBlID0gS0RGX1NDUllQVF9LRVlNQVNURVI7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBmdHItPmtkZl90eXBlID0gS0RGX1NDUllQVF9LRVlNQVNURVI7CisgICAgICAgICAgICBicmVhazsKIAotICAgIGNhc2UgMDoKLSAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFQ7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBmdHItPmtkZl90eXBlID0gS0RGX1NDUllQVDsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgZGVmYXVsdDoKLSAgICAgICAgU0xPR0UoImtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5IGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBTTE9HRSgia2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHkgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgZ2V0X2RldmljZV9zY3J5cHRfcGFyYW1zKGZ0cik7CkBAIC0yMDgwLDggKzIwMDksNyBAQAogICAgIGZ0ci0+cGVyc2lzdF9kYXRhX3NpemUgPSBDUllQVF9QRVJTSVNUX0RBVEFfU0laRTsKICAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9pbmZvKE5VTEwsICZvZmYpID09IDApIHsKICAgICAgICAgZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdID0gb2ZmICsgQ1JZUFRfRk9PVEVSX1RPX1BFUlNJU1RfT0ZGU0VUOwotICAgICAgICBmdHItPnBlcnNpc3RfZGF0YV9vZmZzZXRbMV0gPSBvZmYgKyBDUllQVF9GT09URVJfVE9fUEVSU0lTVF9PRkZTRVQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRyLT5wZXJzaXN0X2RhdGFfc2l6ZTsKKyAgICAgICAgZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdID0gb2ZmICsgQ1JZUFRfRk9PVEVSX1RPX1BFUlNJU1RfT0ZGU0VUICsgZnRyLT5wZXJzaXN0X2RhdGFfc2l6ZTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTIwODksOSArMjAxNyw4IEBACiAKICNkZWZpbmUgRlJBTUVXT1JLX0JPT1RfV0FJVCA2MAogCi1zdGF0aWMgaW50IGNyeXB0ZnNfU0hBMjU2X2ZpbGVibG9jayhjb25zdCBjaGFyKiBmaWxlbmFtZSwgX19sZTgqIGJ1ZikKLXsKLSAgICBpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWXxPX0NMT0VYRUMpOworc3RhdGljIGludCBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY29uc3QgY2hhciogZmlsZW5hbWUsIF9fbGU4KiBidWYpIHsKKyAgICBpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSB8IE9fQ0xPRVhFQyk7CiAgICAgaWYgKGZkID09IC0xKSB7CiAgICAgICAgIFNMT0dFKCJFcnJvciBvcGVuaW5nIGZpbGUgJXMiLCBmaWxlbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTIxMTcsNyArMjA0NCw3IEBACiAKIHN0YXRpYyBpbnQgY3J5cHRmc19lbmFibGVfYWxsX3ZvbHVtZXMoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0ciwgY2hhciogY3J5cHRvX2Jsa2RldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcmVhbF9ibGtkZXYsIGludCBwcmV2aW91c2x5X2VuY3J5cHRlZF91cHRvKSB7Ci0gICAgb2ZmNjRfdCBjdXJfZW5jcnlwdGlvbl9kb25lPTAsIHRvdF9lbmNyeXB0aW9uX3NpemU9MDsKKyAgICBvZmY2NF90IGN1cl9lbmNyeXB0aW9uX2RvbmUgPSAwLCB0b3RfZW5jcnlwdGlvbl9zaXplID0gMDsKICAgICBpbnQgcmMgPSAtMTsKIAogICAgIC8qIFRoZSBzaXplIG9mIHRoZSB1c2VyZGF0YSBwYXJ0aXRpb24sIGFuZCBhZGQgaW4gdGhlIHZvbGQgdm9sdW1lcyBiZWxvdyAqLwpAQCAtMjE1MywxMSArMjA4MCwxMSBAQAogaW50IGNyeXB0ZnNfZW5hYmxlX2ludGVybmFsKGludCBjcnlwdF90eXBlLCBjb25zdCBjaGFyKiBwYXNzd2QsIGludCBub191aSkgewogICAgIGNoYXIgY3J5cHRvX2Jsa2RldltNQVhQQVRITEVOXSwgcmVhbF9ibGtkZXZbTUFYUEFUSExFTl07CiAgICAgdW5zaWduZWQgY2hhciBkZWNyeXB0ZWRfbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07Ci0gICAgaW50IHJjPS0xLCBpOworICAgIGludCByYyA9IC0xLCBpOwogICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKLSAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhICpwZGF0YTsKKyAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhKiBwZGF0YTsKICAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGNoYXIgbG9ja2lkWzMyXSA9IHsgMCB9OworICAgIGNoYXIgbG9ja2lkWzMyXSA9IHswfTsKICAgICBjaGFyIGtleV9sb2NbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBpbnQgbnVtX3ZvbHM7CiAgICAgb2ZmNjRfdCBwcmV2aW91c2x5X2VuY3J5cHRlZF91cHRvID0gMDsKQEAgLTIyMDcsNyArMjEzNCw3IEBACiAgICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIDAsIHJlYWxfYmxrZGV2LCBzaXplb2YocmVhbF9ibGtkZXYpKTsKIAogICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgcmVhbCBibG9jayBkZXZpY2UgKi8KLSAgICBmZCA9IG9wZW4ocmVhbF9ibGtkZXYsIE9fUkRPTkxZfE9fQ0xPRVhFQyk7CisgICAgZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JET05MWSB8IE9fQ0xPRVhFQyk7CiAgICAgaWYgKGZkID09IC0xKSB7CiAgICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBibG9jayBkZXZpY2UgJXNcbiIsIHJlYWxfYmxrZGV2KTsKICAgICAgICAgZ290byBlcnJvcl91bmVuY3J5cHRlZDsKQEAgLTIyMjQsOCArMjE1MSw3IEBACiAgICAgaWYgKCFzdHJjbXAoa2V5X2xvYywgS0VZX0lOX0ZPT1RFUikpIHsKICAgICAgICAgdW5zaWduZWQgaW50IGZzX3NpemVfc2VjLCBtYXhfZnNfc2l6ZV9zZWM7CiAgICAgICAgIGZzX3NpemVfc2VjID0gZ2V0X2ZzX3NpemUocmVhbF9ibGtkZXYpOwotICAgICAgICBpZiAoZnNfc2l6ZV9zZWMgPT0gMCkKLSAgICAgICAgICAgIGZzX3NpemVfc2VjID0gZ2V0X2YyZnNfZmlsZXN5c3RlbV9zaXplX3NlYyhyZWFsX2Jsa2Rldik7CisgICAgICAgIGlmIChmc19zaXplX3NlYyA9PSAwKSBmc19zaXplX3NlYyA9IGdldF9mMmZzX2ZpbGVzeXN0ZW1fc2l6ZV9zZWMocmVhbF9ibGtkZXYpOwogCiAgICAgICAgIG1heF9mc19zaXplX3NlYyA9IG5yX3NlYyAtIChDUllQVF9GT09URVJfT0ZGU0VUIC8gQ1JZUFRfU0VDVE9SX1NJWkUpOwogCkBAIC0yMjM5LDcgKzIxNjUsNyBAQAogICAgICAqIGRldmljZSB0byBzbGVlcCBvbiB1cy4gIFdlJ2xsIGdyYWIgYSBwYXJ0aWFsIHdha2Vsb2NrLCBhbmQgaWYgdGhlIFVJCiAgICAgICogd2FudHMgdG8ga2VlcCB0aGUgc2NyZWVuIG9uLCBpdCBjYW4gZ3JhYiBhIGZ1bGwgd2FrZWxvY2suCiAgICAgICovCi0gICAgc25wcmludGYobG9ja2lkLCBzaXplb2YobG9ja2lkKSwgImVuYWJsZWNyeXB0byVkIiwgKGludCkgZ2V0cGlkKCkpOworICAgIHNucHJpbnRmKGxvY2tpZCwgc2l6ZW9mKGxvY2tpZCksICJlbmFibGVjcnlwdG8lZCIsIChpbnQpZ2V0cGlkKCkpOwogICAgIGFjcXVpcmVfd2FrZV9sb2NrKFBBUlRJQUxfV0FLRV9MT0NLLCBsb2NraWQpOwogCiAgICAgLyogVGhlIGluaXQgZmlsZXMgYXJlIHNldHVwIHRvIHN0b3AgdGhlIGNsYXNzIG1haW4gYW5kIGxhdGUgc3RhcnQgd2hlbgpAQCAtMjI5OSw4ICsyMjI1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghc3RyY21wKGtleV9sb2MsIEtFWV9JTl9GT09URVIpKSB7Ci0gICAgICAgICAgICBjcnlwdF9mdHIuZnNfc2l6ZSA9IG5yX3NlYwotICAgICAgICAgICAgICAtIChDUllQVF9GT09URVJfT0ZGU0VUIC8gQ1JZUFRfU0VDVE9SX1NJWkUpOworICAgICAgICAgICAgY3J5cHRfZnRyLmZzX3NpemUgPSBucl9zZWMgLSAoQ1JZUFRfRk9PVEVSX09GRlNFVCAvIENSWVBUX1NFQ1RPUl9TSVpFKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNyeXB0X2Z0ci5mc19zaXplID0gbnJfc2VjOwogICAgICAgICB9CkBAIC0yMzE0LDcgKzIyMzksOCBAQAogICAgICAgICAgICAgY3J5cHRfZnRyLmZsYWdzIHw9IENSWVBUX0lOQ09OU0lTVEVOVF9TVEFURTsKICAgICAgICAgfQogICAgICAgICBjcnlwdF9mdHIuY3J5cHRfdHlwZSA9IGNyeXB0X3R5cGU7Ci0gICAgICAgIHN0cmxjcHkoKGNoYXIgKiljcnlwdF9mdHIuY3J5cHRvX3R5cGVfbmFtZSwgY3J5cHRmc19nZXRfY3J5cHRvX25hbWUoKSwgTUFYX0NSWVBUT19UWVBFX05BTUVfTEVOKTsKKyAgICAgICAgc3RybGNweSgoY2hhciopY3J5cHRfZnRyLmNyeXB0b190eXBlX25hbWUsIGNyeXB0ZnNfZ2V0X2NyeXB0b19uYW1lKCksCisgICAgICAgICAgICAgICAgTUFYX0NSWVBUT19UWVBFX05BTUVfTEVOKTsKIAogICAgICAgICAvKiBNYWtlIGFuIGVuY3J5cHRlZCBtYXN0ZXIga2V5ICovCiAgICAgICAgIGlmIChjcmVhdGVfZW5jcnlwdGVkX3JhbmRvbV9rZXkob25seUNyZWF0ZUhlYWRlciA/IERFRkFVTFRfUEFTU1dPUkQgOiBwYXNzd2QsCkBAIC0yMzI4LDggKzIyNTQsOCBAQAogICAgICAgICAgICAgdW5zaWduZWQgY2hhciBmYWtlX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwogICAgICAgICAgICAgdW5zaWduZWQgY2hhciBlbmNyeXB0ZWRfZmFrZV9tYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsKICAgICAgICAgICAgIG1lbXNldChmYWtlX21hc3Rlcl9rZXksIDAsIHNpemVvZihmYWtlX21hc3Rlcl9rZXkpKTsKLSAgICAgICAgICAgIGVuY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIGNyeXB0X2Z0ci5zYWx0LCBmYWtlX21hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkX2Zha2VfbWFzdGVyX2tleSwgJmNyeXB0X2Z0cik7CisgICAgICAgICAgICBlbmNyeXB0X21hc3Rlcl9rZXkocGFzc3dkLCBjcnlwdF9mdHIuc2FsdCwgZmFrZV9tYXN0ZXJfa2V5LCBlbmNyeXB0ZWRfZmFrZV9tYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcnlwdF9mdHIpOwogICAgICAgICB9CiAKICAgICAgICAgLyogV3JpdGUgdGhlIGtleSB0byB0aGUgZW5kIG9mIHRoZSBwYXJ0aXRpb24gKi8KQEAgLTIzMzksMTEgKzIyNjUsMTEgQEAKICAgICAgICAgICogSWYgbm9uZSwgY3JlYXRlIGEgdmFsaWQgZW1wdHkgdGFibGUgYW5kIHNhdmUgdGhhdC4KICAgICAgICAgICovCiAgICAgICAgIGlmICghcGVyc2lzdF9kYXRhKSB7Ci0gICAgICAgICAgICBwZGF0YSA9IChjcnlwdF9wZXJzaXN0X2RhdGEgKiltYWxsb2MoQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOwotICAgICAgICAgICBpZiAocGRhdGEpIHsKLSAgICAgICAgICAgICAgIGluaXRfZW1wdHlfcGVyc2lzdF9kYXRhKHBkYXRhLCBDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7Ci0gICAgICAgICAgICAgICBwZXJzaXN0X2RhdGEgPSBwZGF0YTsKLSAgICAgICAgICAgfQorICAgICAgICAgICAgcGRhdGEgPSAoY3J5cHRfcGVyc2lzdF9kYXRhKiltYWxsb2MoQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOworICAgICAgICAgICAgaWYgKHBkYXRhKSB7CisgICAgICAgICAgICAgICAgaW5pdF9lbXB0eV9wZXJzaXN0X2RhdGEocGRhdGEsIENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKKyAgICAgICAgICAgICAgICBwZXJzaXN0X2RhdGEgPSBwZGF0YTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAocGVyc2lzdF9kYXRhKSB7CiAgICAgICAgICAgICBzYXZlX3BlcnNpc3RlbnRfZGF0YSgpOwpAQCAtMjM3Nyw4ICsyMzAzLDggQEAKICAgICAgICAgX19sZTggaGFzaF9maXJzdF9ibG9ja1tTSEEyNTZfRElHRVNUX0xFTkdUSF07CiAgICAgICAgIHJjID0gY3J5cHRmc19TSEEyNTZfZmlsZWJsb2NrKGNyeXB0b19ibGtkZXYsIGhhc2hfZmlyc3RfYmxvY2spOwogCi0gICAgICAgIGlmICghcmMgJiYgbWVtY21wKGhhc2hfZmlyc3RfYmxvY2ssIGNyeXB0X2Z0ci5oYXNoX2ZpcnN0X2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFzaF9maXJzdF9ibG9jaykpICE9IDApIHsKKyAgICAgICAgaWYgKCFyYyAmJgorICAgICAgICAgICAgbWVtY21wKGhhc2hfZmlyc3RfYmxvY2ssIGNyeXB0X2Z0ci5oYXNoX2ZpcnN0X2Jsb2NrLCBzaXplb2YoaGFzaF9maXJzdF9ibG9jaykpICE9IDApIHsKICAgICAgICAgICAgIFNMT0dFKCJDaGVja3N1bXMgZG8gbm90IG1hdGNoIC0gdHJpZ2dlciB3aXBlIik7CiAgICAgICAgICAgICByYyA9IC0xOwogICAgICAgICB9CkBAIC0yMzkxLDggKzIzMTcsNyBAQAogCiAgICAgLyogQ2FsY3VsYXRlIGNoZWNrc3VtIGlmIHdlIGFyZSBub3QgZmluaXNoZWQgKi8KICAgICBpZiAoIXJjICYmIGNyeXB0X2Z0ci5lbmNyeXB0ZWRfdXB0byAhPSBjcnlwdF9mdHIuZnNfc2l6ZSkgewotICAgICAgICByYyA9IGNyeXB0ZnNfU0hBMjU2X2ZpbGVibG9jayhjcnlwdG9fYmxrZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHIuaGFzaF9maXJzdF9ibG9jayk7CisgICAgICAgIHJjID0gY3J5cHRmc19TSEEyNTZfZmlsZWJsb2NrKGNyeXB0b19ibGtkZXYsIGNyeXB0X2Z0ci5oYXNoX2ZpcnN0X2Jsb2NrKTsKICAgICAgICAgaWYgKHJjKSB7CiAgICAgICAgICAgICBTTE9HRSgiRXJyb3IgY2FsY3VsYXRpbmcgY2hlY2tzdW0gZm9yIGNvbnRpbnVpbmcgZW5jcnlwdGlvbiIpOwogICAgICAgICAgICAgcmMgPSAtMTsKQEAgLTI0MDIsNyArMjMyNyw3IEBACiAgICAgLyogVW5kbyB0aGUgZG0tY3J5cHQgbWFwcGluZyB3aGV0aGVyIHdlIHN1Y2NlZWQgb3Igbm90ICovCiAgICAgZGVsZXRlX2NyeXB0b19ibGtfZGV2KENSWVBUT19CTE9DS19ERVZJQ0UpOwogCi0gICAgaWYgKCEgcmMpIHsKKyAgICBpZiAoIXJjKSB7CiAgICAgICAgIC8qIFN1Y2Nlc3MgKi8KICAgICAgICAgY3J5cHRfZnRyLmZsYWdzICY9IH5DUllQVF9JTkNPTlNJU1RFTlRfU1RBVEU7CiAKQEAgLTI0NTAsOCArMjM3NSw3IEBACiAgICAgICAgICAgICBTTE9HRSgiZW5jcnlwdGlvbiBmYWlsZWQgLSByZWJvb3RpbmcgaW50byByZWNvdmVyeSB0byB3aXBlIGRhdGFcbiIpOwogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyOwogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG9wdGlvbnMgPSB7Ci0gICAgICAgICAgICAgICAgIi0td2lwZV9kYXRhXG4tLXJlYXNvbj1jcnlwdGZzX2VuYWJsZV9pbnRlcm5hbFxuIgotICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAiLS13aXBlX2RhdGFcbi0tcmVhc29uPWNyeXB0ZnNfZW5hYmxlX2ludGVybmFsXG4ifTsKICAgICAgICAgICAgIGlmICghd3JpdGVfYm9vdGxvYWRlcl9tZXNzYWdlKG9wdGlvbnMsICZlcnIpKSB7CiAgICAgICAgICAgICAgICAgU0xPR0UoImNvdWxkIG5vdCB3cml0ZSBib290bG9hZGVyIG1lc3NhZ2U6ICVzIiwgZXJyLmNfc3RyKCkpOwogICAgICAgICAgICAgfQpAQCAtMjQ4NCw3ICsyNDA4LDkgQEAKICAgICAgKiBidXQgdGhlIGZyYW1ld29yayBpcyBzdG9wcGVkIGFuZCBub3QgcmVzdGFydGVkIHRvIHNob3cgdGhlIGVycm9yLCBzbyBpdCdzIHVwIHRvCiAgICAgICogdm9sZCB0byByZXN0YXJ0IHRoZSBzeXN0ZW0uCiAgICAgICovCi0gICAgU0xPR0UoIkVycm9yIGVuYWJsaW5nIGVuY3J5cHRpb24gYWZ0ZXIgZnJhbWV3b3JrIGlzIHNodXRkb3duLCBubyBkYXRhIGNoYW5nZWQsIHJlc3RhcnRpbmcgc3lzdGVtIik7CisgICAgU0xPR0UoCisgICAgICAgICJFcnJvciBlbmFibGluZyBlbmNyeXB0aW9uIGFmdGVyIGZyYW1ld29yayBpcyBzaHV0ZG93biwgbm8gZGF0YSBjaGFuZ2VkLCByZXN0YXJ0aW5nICIKKyAgICAgICAgInN5c3RlbSIpOwogICAgIGNyeXB0ZnNfcmVib290KFJlYm9vdFR5cGU6OnJlYm9vdCk7CiAKICAgICAvKiBzaG91bGRuJ3QgZ2V0IGhlcmUgKi8KQEAgLTI1MDMsOCArMjQyOSw3IEBACiAgICAgcmV0dXJuIGNyeXB0ZnNfZW5hYmxlX2ludGVybmFsKENSWVBUX1RZUEVfREVGQVVMVCwgREVGQVVMVF9QQVNTV09SRCwgbm9fdWkpOwogfQogCi1pbnQgY3J5cHRmc19jaGFuZ2VwdyhpbnQgY3J5cHRfdHlwZSwgY29uc3QgY2hhciAqbmV3cHcpCi17CitpbnQgY3J5cHRmc19jaGFuZ2VwdyhpbnQgY3J5cHRfdHlwZSwgY29uc3QgY2hhciogbmV3cHcpIHsKICAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICBTTE9HRSgiY3J5cHRmc19jaGFuZ2VwdyBub3QgdmFsaWQgZm9yIGZpbGUgZW5jcnlwdGlvbiIpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yNTMyLDEyICsyNDU3LDggQEAKIAogICAgIGNyeXB0X2Z0ci5jcnlwdF90eXBlID0gY3J5cHRfdHlwZTsKIAotICAgIHJjID0gZW5jcnlwdF9tYXN0ZXJfa2V5KGNyeXB0X3R5cGUgPT0gQ1JZUFRfVFlQRV9ERUZBVUxUID8gREVGQVVMVF9QQVNTV09SRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ld3B3LAotICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHIuc2FsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLm1hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICZjcnlwdF9mdHIpOworICAgIHJjID0gZW5jcnlwdF9tYXN0ZXJfa2V5KGNyeXB0X3R5cGUgPT0gQ1JZUFRfVFlQRV9ERUZBVUxUID8gREVGQVVMVF9QQVNTV09SRCA6IG5ld3B3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci5zYWx0LCBzYXZlZF9tYXN0ZXJfa2V5LCBjcnlwdF9mdHIubWFzdGVyX2tleSwgJmNyeXB0X2Z0cik7CiAgICAgaWYgKHJjKSB7CiAgICAgICAgIFNMT0dFKCJFbmNyeXB0IG1hc3RlciBrZXkgZmFpbGVkOiAlZCIsIHJjKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjU2NSwxNCArMjQ4NiwxMyBAQAogICAgICAgICBkc2l6ZSA9IENSWVBUX1BFUlNJU1RfREFUQV9TSVpFOwogICAgIH0KIAotICAgIG1heF9wZXJzaXN0ZW50X2VudHJpZXMgPSAoZHNpemUgLSBzaXplb2Yoc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSkpIC8KLSAgICAgICAgc2l6ZW9mKHN0cnVjdCBjcnlwdF9wZXJzaXN0X2VudHJ5KTsKKyAgICBtYXhfcGVyc2lzdGVudF9lbnRyaWVzID0KKyAgICAgICAgKGRzaXplIC0gc2l6ZW9mKHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEpKSAvIHNpemVvZihzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9lbnRyeSk7CiAKICAgICByZXR1cm4gbWF4X3BlcnNpc3RlbnRfZW50cmllczsKIH0KIAotc3RhdGljIGludCBwZXJzaXN0X2dldF9rZXkoY29uc3QgY2hhciAqZmllbGRuYW1lLCBjaGFyICp2YWx1ZSkKLXsKK3N0YXRpYyBpbnQgcGVyc2lzdF9nZXRfa2V5KGNvbnN0IGNoYXIqIGZpZWxkbmFtZSwgY2hhciogdmFsdWUpIHsKICAgICB1bnNpZ25lZCBpbnQgaTsKIAogICAgIGlmIChwZXJzaXN0X2RhdGEgPT0gTlVMTCkgewpAQCAtMjU4OSw4ICsyNTA5LDcgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgcGVyc2lzdF9zZXRfa2V5KGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGludCBlbmNyeXB0ZWQpCi17CitzdGF0aWMgaW50IHBlcnNpc3Rfc2V0X2tleShjb25zdCBjaGFyKiBmaWVsZG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBpbnQgZW5jcnlwdGVkKSB7CiAgICAgdW5zaWduZWQgaW50IGk7CiAgICAgdW5zaWduZWQgaW50IG51bTsKICAgICB1bnNpZ25lZCBpbnQgbWF4X3BlcnNpc3RlbnRfZW50cmllczsKQEAgLTI2MjgsNyArMjU0Nyw3IEBACiAgKiBUZXN0IGlmIGtleSBpcyBwYXJ0IG9mIHRoZSBtdWx0aS1lbnRyeSAoZmllbGQsIGluZGV4KSBzZXF1ZW5jZS4gUmV0dXJuIG5vbi16ZXJvIGlmIGtleSBpcyBpbiB0aGUKICAqIHNlcXVlbmNlIGFuZCBpdHMgaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGluZGV4LiBSZXR1cm4gMCBvdGhlcndpc2UuCiAgKi8KLWludCBtYXRjaF9tdWx0aV9lbnRyeShjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKmZpZWxkLCB1bnNpZ25lZCBpbmRleCkgeworaW50IG1hdGNoX211bHRpX2VudHJ5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogZmllbGQsIHVuc2lnbmVkIGluZGV4KSB7CiAgICAgc3RkOjpzdHJpbmcga2V5XyA9IGtleTsKICAgICBzdGQ6OnN0cmluZyBmaWVsZF8gPSBmaWVsZDsKIApAQCAtMjY1NSw4ICsyNTc0LDcgQEAKICAqIGFuZCBQRVJTSVNUX0RFTF9LRVlfRVJST1JfT1RIRVIgaWYgZXJyb3Igb2NjdXJzLgogICoKICAqLwotc3RhdGljIGludCBwZXJzaXN0X2RlbF9rZXlzKGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgdW5zaWduZWQgaW5kZXgpCi17CitzdGF0aWMgaW50IHBlcnNpc3RfZGVsX2tleXMoY29uc3QgY2hhciogZmllbGRuYW1lLCB1bnNpZ25lZCBpbmRleCkgewogICAgIHVuc2lnbmVkIGludCBpOwogICAgIHVuc2lnbmVkIGludCBqOwogICAgIHVuc2lnbmVkIGludCBudW07CkBAIC0yNjY3LDcgKzI1ODUsNyBAQAogCiAgICAgbnVtID0gcGVyc2lzdF9kYXRhLT5wZXJzaXN0X3ZhbGlkX2VudHJpZXM7CiAKLSAgICBqID0gMDsgLy8gcG9pbnRzIHRvIHRoZSBlbmQgb2Ygbm9uLWRlbGV0ZWQgZW50cmllcy4KKyAgICBqID0gMDsgIC8vIHBvaW50cyB0byB0aGUgZW5kIG9mIG5vbi1kZWxldGVkIGVudHJpZXMuCiAgICAgLy8gRmlsdGVyIG91dCB0by1iZS1kZWxldGVkIGVudHJpZXMgaW4gcGxhY2UuCiAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAgICAgICAgIGlmICghbWF0Y2hfbXVsdGlfZW50cnkocGVyc2lzdF9kYXRhLT5wZXJzaXN0X2VudHJ5W2ldLmtleSwgZmllbGRuYW1lLCBpbmRleCkpIHsKQEAgLTI2ODcsOCArMjYwNSw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IHBlcnNpc3RfY291bnRfa2V5cyhjb25zdCBjaGFyICpmaWVsZG5hbWUpCi17CitzdGF0aWMgaW50IHBlcnNpc3RfY291bnRfa2V5cyhjb25zdCBjaGFyKiBmaWVsZG5hbWUpIHsKICAgICB1bnNpZ25lZCBpbnQgaTsKICAgICB1bnNpZ25lZCBpbnQgY291bnQ7CiAKQEAgLTI3MDcsOCArMjYyNCw3IEBACiB9CiAKIC8qIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4gKi8KLWludCBjcnlwdGZzX2dldGZpZWxkKGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgY2hhciAqdmFsdWUsIGludCBsZW4pCi17CitpbnQgY3J5cHRmc19nZXRmaWVsZChjb25zdCBjaGFyKiBmaWVsZG5hbWUsIGNoYXIqIHZhbHVlLCBpbnQgbGVuKSB7CiAgICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoIkNhbm5vdCBnZXQgZmllbGQgd2hlbiBmaWxlIGVuY3J5cHRlZCIpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yNzM2LDcgKzI2NTIsNyBAQAogICAgIC8vIHN0aXRjaCB0aGVtIGJhY2sgdG9nZXRoZXIuCiAgICAgaWYgKCFwZXJzaXN0X2dldF9rZXkoZmllbGRuYW1lLCB0ZW1wX3ZhbHVlKSkgewogICAgICAgICAvLyBXZSBmb3VuZCBpdCwgY29weSBpdCB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyIGFuZCBrZWVwIGdvaW5nIHVudGlsIGFsbCBlbnRyaWVzIGFyZSByZWFkLgotICAgICAgICBpZiAoc3RybGNweSh2YWx1ZSwgdGVtcF92YWx1ZSwgbGVuKSA+PSAodW5zaWduZWQpIGxlbikgeworICAgICAgICBpZiAoc3RybGNweSh2YWx1ZSwgdGVtcF92YWx1ZSwgbGVuKSA+PSAodW5zaWduZWQpbGVuKSB7CiAgICAgICAgICAgICAvLyB2YWx1ZSB0b28gc21hbGwKICAgICAgICAgICAgIHJjID0gQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX0JVRl9UT09fU01BTEw7CiAgICAgICAgICAgICBnb3RvIG91dDsKQEAgLTI3NDUsNyArMjY2MSw3IEBACiAKICAgICAgICAgZm9yIChpID0gMTsgLyogYnJlYWsgZXhwbGljaXRseSAqLzsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoc25wcmludGYodGVtcF9maWVsZCwgc2l6ZW9mKHRlbXBfZmllbGQpLCAiJXNfJWQiLCBmaWVsZG5hbWUsIGkpID49Ci0gICAgICAgICAgICAgICAgICAgIChpbnQpIHNpemVvZih0ZW1wX2ZpZWxkKSkgeworICAgICAgICAgICAgICAgIChpbnQpc2l6ZW9mKHRlbXBfZmllbGQpKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZpZWxkbmFtZSBpcyB2ZXJ5IGxvbmcsIHdlIHN0b3AgYXMgc29vbiBhcyBpdCBiZWdpbnMgdG8gb3ZlcmZsb3cgdGhlCiAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBmaWVsZCBsZW5ndGguIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBpbiBmYWN0IGZ1bGx5IHJlYWQgb3V0IHRoZSBvcmlnaW5hbAogICAgICAgICAgICAgICAgIC8vIHZhbHVlIGJlY2F1c2UgY3J5cHRmc19zZXRmaWVsZCB3b3VsZCBub3QgYWxsb3cgZmllbGRzIHdpdGggbG9uZ2VyIG5hbWVzIHRvIGJlCkBAIC0yNzUzLDExICsyNjY5LDExIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIXBlcnNpc3RfZ2V0X2tleSh0ZW1wX2ZpZWxkLCB0ZW1wX3ZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgaWYgKHN0cmxjYXQodmFsdWUsIHRlbXBfdmFsdWUsIGxlbikgPj0gKHVuc2lnbmVkKWxlbikgewotICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHRvbyBzbWFsbC4KLSAgICAgICAgICAgICAgICAgICAgICByYyA9IENSWVBUT19HRVRGSUVMRF9FUlJPUl9CVUZfVE9PX1NNQUxMOwotICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHJsY2F0KHZhbHVlLCB0ZW1wX3ZhbHVlLCBsZW4pID49ICh1bnNpZ25lZClsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdG9vIHNtYWxsLgorICAgICAgICAgICAgICAgICAgICByYyA9IENSWVBUT19HRVRGSUVMRF9FUlJPUl9CVUZfVE9PX1NNQUxMOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIEV4aGF1c3QgYWxsIGVudHJpZXMuCiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yNzczLDggKzI2ODksNyBAQAogfQogCiAvKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuICovCi1pbnQgY3J5cHRmc19zZXRmaWVsZChjb25zdCBjaGFyICpmaWVsZG5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoteworaW50IGNyeXB0ZnNfc2V0ZmllbGQoY29uc3QgY2hhciogZmllbGRuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkgewogICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJDYW5ub3Qgc2V0IGZpZWxkIHdoZW4gZmlsZSBlbmNyeXB0ZWQiKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjc5OCw3ICsyNzEzLDcgQEAKICAgICB9CiAKICAgICBwcm9wZXJ0eV9nZXQoInJvLmNyeXB0by5zdGF0ZSIsIGVuY3J5cHRlZF9zdGF0ZSwgIiIpOwotICAgIGlmICghc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpICkgeworICAgIGlmICghc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CiAgICAgICAgIGVuY3J5cHRlZCA9IDE7CiAgICAgfQogCkBAIC0yODY3LDE0ICsyNzgyLDE0IEBACiAgKiBPbiBzdWNjZXNzIHRyaWdnZXIgbmV4dCBpbml0IHBoYXNlIGFuZCByZXR1cm4gMC4KICAqIEN1cnJlbnRseSBkbyBub3QgaGFuZGxlIGZhaWx1cmUgLSBzZWUgVE9ETyBiZWxvdy4KICAqLwotaW50IGNyeXB0ZnNfbW91bnRfZGVmYXVsdF9lbmNyeXB0ZWQodm9pZCkKLXsKK2ludCBjcnlwdGZzX21vdW50X2RlZmF1bHRfZW5jcnlwdGVkKHZvaWQpIHsKICAgICBpbnQgY3J5cHRfdHlwZSA9IGNyeXB0ZnNfZ2V0X3Bhc3N3b3JkX3R5cGUoKTsKICAgICBpZiAoY3J5cHRfdHlwZSA8IDAgfHwgY3J5cHRfdHlwZSA+IENSWVBUX1RZUEVfTUFYX1RZUEUpIHsKICAgICAgICAgU0xPR0UoIkJhZCBjcnlwdCB0eXBlIC0gZXJyb3IiKTsKICAgICB9IGVsc2UgaWYgKGNyeXB0X3R5cGUgIT0gQ1JZUFRfVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgIFNMT0dEKCJQYXNzd29yZCBpcyBub3QgZGVmYXVsdCAtICIKLSAgICAgICAgICAgICAgInN0YXJ0aW5nIG1pbiBmcmFtZXdvcmsgdG8gcHJvbXB0Iik7CisgICAgICAgIFNMT0dEKAorICAgICAgICAgICAgIlBhc3N3b3JkIGlzIG5vdCBkZWZhdWx0IC0gIgorICAgICAgICAgICAgInN0YXJ0aW5nIG1pbiBmcmFtZXdvcmsgdG8gcHJvbXB0Iik7CiAgICAgICAgIHByb3BlcnR5X3NldCgidm9sZC5kZWNyeXB0IiwgInRyaWdnZXJfcmVzdGFydF9taW5fZnJhbWV3b3JrIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0gZWxzZSBpZiAoY3J5cHRmc19jaGVja19wYXNzd2QoREVGQVVMVF9QQVNTV09SRCkgPT0gMCkgewpAQCAtMjg5NCw4ICsyODA5LDcgQEAKIAogLyogUmV0dXJucyB0eXBlIG9mIHRoZSBwYXNzd29yZCwgZGVmYXVsdCwgcGF0dGVybiwgcGluIG9yIHBhc3N3b3JkLgogICovCi1pbnQgY3J5cHRmc19nZXRfcGFzc3dvcmRfdHlwZSh2b2lkKQoteworaW50IGNyeXB0ZnNfZ2V0X3Bhc3N3b3JkX3R5cGUodm9pZCkgewogICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJjcnlwdGZzX2dldF9wYXNzd29yZF90eXBlIG5vdCB2YWxpZCBmb3IgZmlsZSBlbmNyeXB0aW9uIik7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTI5MTUsOCArMjgyOSw3IEBACiAgICAgcmV0dXJuIGNyeXB0X2Z0ci5jcnlwdF90eXBlOwogfQogCi1jb25zdCBjaGFyKiBjcnlwdGZzX2dldF9wYXNzd29yZCgpCi17Citjb25zdCBjaGFyKiBjcnlwdGZzX2dldF9wYXNzd29yZCgpIHsKICAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICBTTE9HRSgiY3J5cHRmc19nZXRfcGFzc3dvcmQgbm90IHZhbGlkIGZvciBmaWxlIGVuY3J5cHRpb24iKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yOTMyLDggKzI4NDUsNyBAQAogICAgIH0KIH0KIAotdm9pZCBjcnlwdGZzX2NsZWFyX3Bhc3N3b3JkKCkKLXsKK3ZvaWQgY3J5cHRmc19jbGVhcl9wYXNzd29yZCgpIHsKICAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihwYXNzd29yZCk7CiAgICAgICAgIG1lbXNldChwYXNzd29yZCwgMCwgbGVuKTsKQEAgLTI5NDMsOCArMjg1NSw3IEBACiAgICAgfQogfQogCi1pbnQgY3J5cHRmc19pc0NvbnZlcnRpYmxlVG9GQkUoKQoteworaW50IGNyeXB0ZnNfaXNDb252ZXJ0aWJsZVRvRkJFKCkgewogICAgIHN0cnVjdCBmc3RhYl9yZWMqIHJlYyA9IGZzX21ncl9nZXRfZW50cnlfZm9yX21vdW50X3BvaW50KGZzdGFiX2RlZmF1bHQsIERBVEFfTU5UX1BPSU5UKTsKICAgICByZXR1cm4gKHJlYyAmJiBmc19tZ3JfaXNfY29udmVydGlibGVfdG9fZmJlKHJlYykpID8gMSA6IDA7CiB9CmRpZmYgLS1naXQgYS9jcnlwdGZzLmggYi9jcnlwdGZzLmgKaW5kZXggZGM3YThjMy4uNjkyZDdlZSAxMDA2NDQKLS0tIGEvY3J5cHRmcy5oCisrKyBiL2NyeXB0ZnMuaApAQCAtNTEsMzIgKzUxLDM5IEBACiAKIC8qIGRlZmluaXRpb25zIG9mIGZsYWdzIGluIHRoZSBzdHJ1Y3R1cmUgYmVsb3cgKi8KICNkZWZpbmUgQ1JZUFRfTU5UX0tFWV9VTkVOQ1JZUFRFRCAweDEgLyogVGhlIGtleSBmb3IgdGhlIHBhcnRpdGlvbiBpcyBub3QgZW5jcnlwdGVkLiAqLwotI2RlZmluZSBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTIDB4MiAvKiBFbmNyeXB0aW9uIHBhcnRpYWxseSBjb21wbGV0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZF91cHRvIHZhbGlkKi8KLSNkZWZpbmUgQ1JZUFRfSU5DT05TSVNURU5UX1NUQVRFIDB4NCAvKiBTZXQgd2hlbiBzdGFydGluZyBlbmNyeXB0aW9uLCBjbGVhciB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCBjbGVhbmx5LCBlaXRoZXIgdGhyb3VnaCBzdWNjZXNzIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5IG1hcmtlZCBwYXJ0aWFsIGVuY3J5cHRpb24gKi8KLSNkZWZpbmUgQ1JZUFRfREFUQV9DT1JSVVBUIDB4OCAvKiBTZXQgd2hlbiBlbmNyeXB0aW9uIGlzIGZpbmUsIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmx5aW5nIHZvbHVtZSBpcyBjb3JydXB0ICovCi0jZGVmaW5lIENSWVBUX0ZPUkNFX0VOQ1JZUFRJT04gMHgxMCAvKiBTZXQgd2hlbiBpdCBpcyB0aW1lIHRvIGVuY3J5cHQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIG9uIGJvb3QuIEV2ZXJ5dGhpbmcgaW4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGlzIHNldCB1cCBjb3JyZWN0bHkgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRob3VnaCBkZXZpY2UgaXMgZW5jcnlwdGVkIGV4Y2VwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgbWFzdGVyIGtleSBpcyBlbmNyeXB0ZWQgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgcGFzc3dvcmQuICovCi0jZGVmaW5lIENSWVBUX0ZPUkNFX0NPTVBMRVRFIDB4MjAgLyogU2V0IHdoZW4gdGhlIGFib3ZlIGVuY3J5cHRpb24gY3ljbGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZS4gT24gbmV4dCBjcnlwdGtlZXBlciBlbnRyeSwgbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFzc3dvcmQuIElmIGl0IG1hdGNoZXMgZml4IHRoZSBtYXN0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgYW5kIHJlbW92ZSB0aGlzIGZsYWcuICovCisjZGVmaW5lIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MgICAgICAgXAorICAgIDB4MiAvKiBFbmNyeXB0aW9uIHBhcnRpYWxseSBjb21wbGV0ZWQsIFwKKyAgICAgICAgICAgZW5jcnlwdGVkX3VwdG8gdmFsaWQqLworI2RlZmluZSBDUllQVF9JTkNPTlNJU1RFTlRfU1RBVEUgICAgICAgICAgICAgICAgICAgIFwKKyAgICAweDQgLyogU2V0IHdoZW4gc3RhcnRpbmcgZW5jcnlwdGlvbiwgY2xlYXIgd2hlbiBcCisgICAgICAgICAgIGV4aXQgY2xlYW5seSwgZWl0aGVyIHRocm91Z2ggc3VjY2VzcyBvciAgXAorICAgICAgICAgICBjb3JyZWN0bHkgbWFya2VkIHBhcnRpYWwgZW5jcnlwdGlvbiAqLworI2RlZmluZSBDUllQVF9EQVRBX0NPUlJVUFQgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDB4OCAvKiBTZXQgd2hlbiBlbmNyeXB0aW9uIGlzIGZpbmUsIGJ1dCB0aGUgXAorICAgICAgICAgICB1bmRlcmx5aW5nIHZvbHVtZSBpcyBjb3JydXB0ICovCisjZGVmaW5lIENSWVBUX0ZPUkNFX0VOQ1JZUFRJT04gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgMHgxMCAvKiBTZXQgd2hlbiBpdCBpcyB0aW1lIHRvIGVuY3J5cHQgdGhpcyAgICAgICBcCisgICAgICAgICAgICB2b2x1bWUgb24gYm9vdC4gRXZlcnl0aGluZyBpbiB0aGlzICAgICAgICBcCisgICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgc2V0IHVwIGNvcnJlY3RseSBhcyAgICAgICAgICBcCisgICAgICAgICAgICB0aG91Z2ggZGV2aWNlIGlzIGVuY3J5cHRlZCBleGNlcHQgICAgICAgICBcCisgICAgICAgICAgICB0aGF0IHRoZSBtYXN0ZXIga2V5IGlzIGVuY3J5cHRlZCB3aXRoIHRoZSBcCisgICAgICAgICAgICBkZWZhdWx0IHBhc3N3b3JkLiAqLworI2RlZmluZSBDUllQVF9GT1JDRV9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAweDIwIC8qIFNldCB3aGVuIHRoZSBhYm92ZSBlbmNyeXB0aW9uIGN5Y2xlIGlzICAgICBcCisgICAgICAgICAgICBjb21wbGV0ZS4gT24gbmV4dCBjcnlwdGtlZXBlciBlbnRyeSwgbWF0Y2ggXAorICAgICAgICAgICAgdGhlIHBhc3N3b3JkLiBJZiBpdCBtYXRjaGVzIGZpeCB0aGUgbWFzdGVyIFwKKyAgICAgICAgICAgIGtleSBhbmQgcmVtb3ZlIHRoaXMgZmxhZy4gKi8KIAogLyogQWxsb3dlZCB2YWx1ZXMgZm9yIHR5cGUgaW4gdGhlIHN0cnVjdHVyZSBiZWxvdyAqLwotI2RlZmluZSBDUllQVF9UWVBFX1BBU1NXT1JEIDAgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBhc3N3b3JkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBNdXN0IGJlIHplcm8gdG8gYmUgY29tcGF0aWJsZSB3aXRoIHByZS1MCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZXZpY2VzIHdoZXJlIHR5cGUgaXMgYWx3YXlzIHBhc3N3b3JkLiovCi0jZGVmaW5lIENSWVBUX1RZUEVfREVGQVVMVCAgMSAvKiBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZCB3aXRoIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhc3N3b3JkICovCi0jZGVmaW5lIENSWVBUX1RZUEVfUEFUVEVSTiAgMiAvKiBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZCB3aXRoIGEgcGF0dGVybiAqLwotI2RlZmluZSBDUllQVF9UWVBFX1BJTiAgICAgIDMgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBpbiAqLworI2RlZmluZSBDUllQVF9UWVBFX1BBU1NXT1JEICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgMCAvKiBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZCB3aXRoIGEgcGFzc3dvcmQgIFwKKyAgICAgICAqIE11c3QgYmUgemVybyB0byBiZSBjb21wYXRpYmxlIHdpdGggcHJlLUwgXAorICAgICAgICogZGV2aWNlcyB3aGVyZSB0eXBlIGlzIGFsd2F5cyBwYXNzd29yZC4qLworI2RlZmluZSBDUllQVF9UWVBFX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZCB3aXRoIGRlZmF1bHQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYXNzd29yZCAqLworI2RlZmluZSBDUllQVF9UWVBFX1BBVFRFUk4gMiAvKiBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZCB3aXRoIGEgcGF0dGVybiAqLworI2RlZmluZSBDUllQVF9UWVBFX1BJTiAzICAgICAvKiBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZCB3aXRoIGEgcGluICovCiAjZGVmaW5lIENSWVBUX1RZUEVfTUFYX1RZUEUgMyAvKiB0eXBlIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlICovCiAKICNkZWZpbmUgQ1JZUFRfTU5UX01BR0lDIDB4RDBCNUIxQzQKQEAgLTkyLDc4ICs5OSw3OCBAQAogI2RlZmluZSBLRVlNQVNURVJfQkxPQl9TSVpFIDIwNDgKIAogLyogX19sZTMyIGFuZCBfX2xlMTYgZGVmaW5lZCBpbiBzeXN0ZW0vZXh0cmFzL2V4dDRfdXRpbHMvZXh0NF91dGlscy5oICovCi0jZGVmaW5lIF9fbGU4ICB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIF9fbGU4IHVuc2lnbmVkIGNoYXIKIAogI2lmICFkZWZpbmVkKFNIQTI1Nl9ESUdFU1RfTEVOR1RIKQogI2RlZmluZSBTSEEyNTZfRElHRVNUX0xFTkdUSCAzMgogI2VuZGlmCiAKIHN0cnVjdCBjcnlwdF9tbnRfZnRyIHsKLSAgX19sZTMyIG1hZ2ljOyAgICAgICAgIC8qIFNlZSBhYm92ZSAqLwotICBfX2xlMTYgbWFqb3JfdmVyc2lvbjsKLSAgX19sZTE2IG1pbm9yX3ZlcnNpb247Ci0gIF9fbGUzMiBmdHJfc2l6ZTsgICAgICAvKiBpbiBieXRlcywgbm90IGluY2x1ZGluZyBrZXkgZm9sbG93aW5nICovCi0gIF9fbGUzMiBmbGFnczsgICAgICAgICAvKiBTZWUgYWJvdmUgKi8KLSAgX19sZTMyIGtleXNpemU7ICAgICAgIC8qIGluIGJ5dGVzICovCi0gIF9fbGUzMiBjcnlwdF90eXBlOyAgICAvKiBob3cgbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQuIE11c3QgYmUgYQotICAgICAgICAgICAgICAgICAgICAgICAgICogQ1JZUFRfVFlQRV9YWFggdmFsdWUgKi8KLSAgX19sZTY0IGZzX3NpemU7ICAgICAgIC8qIFNpemUgb2YgdGhlIGVuY3J5cHRlZCBmcywgaW4gNTEyIGJ5dGUgc2VjdG9ycyAqLwotICBfX2xlMzIgZmFpbGVkX2RlY3J5cHRfY291bnQ7IC8qIGNvdW50IG9mICMgb2YgZmFpbGVkIGF0dGVtcHRzIHRvIGRlY3J5cHQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnQsIHNldCB0byAwIG9uIHN1Y2Nlc3NmdWwgbW91bnQgKi8KLSAgdW5zaWduZWQgY2hhciBjcnlwdG9fdHlwZV9uYW1lW01BWF9DUllQVE9fVFlQRV9OQU1FX0xFTl07IC8qIFRoZSB0eXBlIG9mIGVuY3J5cHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCB0byBkZWNyeXB0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiwgbnVsbCB0ZXJtaW5hdGVkICovCi0gIF9fbGUzMiBzcGFyZTI7ICAgICAgICAvKiBpZ25vcmVkICovCi0gIHVuc2lnbmVkIGNoYXIgbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07IC8qIFRoZSBlbmNyeXB0ZWQga2V5IGZvciBkZWNyeXB0aW5nIHRoZSBmaWxlc3lzdGVtICovCi0gIHVuc2lnbmVkIGNoYXIgc2FsdFtTQUxUX0xFTl07ICAgLyogVGhlIHNhbHQgdXNlZCBmb3IgdGhpcyBlbmNyeXB0aW9uICovCi0gIF9fbGU2NCBwZXJzaXN0X2RhdGFfb2Zmc2V0WzJdOyAgLyogQWJzb2x1dGUgb2Zmc2V0IHRvIGJvdGggY29waWVzIG9mIGNyeXB0X3BlcnNpc3RfZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9uIGRldmljZSB3aXRoIHRoYXQgaW5mbywgZWl0aGVyIHRoZSBmb290ZXIgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVhbF9ibGtkZXZpY2Ugb3IgdGhlIG1ldGFkYXRhIHBhcnRpdGlvbi4gKi8KKyAgICBfX2xlMzIgbWFnaWM7IC8qIFNlZSBhYm92ZSAqLworICAgIF9fbGUxNiBtYWpvcl92ZXJzaW9uOworICAgIF9fbGUxNiBtaW5vcl92ZXJzaW9uOworICAgIF9fbGUzMiBmdHJfc2l6ZTsgICAgICAgICAgICAgLyogaW4gYnl0ZXMsIG5vdCBpbmNsdWRpbmcga2V5IGZvbGxvd2luZyAqLworICAgIF9fbGUzMiBmbGFnczsgICAgICAgICAgICAgICAgLyogU2VlIGFib3ZlICovCisgICAgX19sZTMyIGtleXNpemU7ICAgICAgICAgICAgICAvKiBpbiBieXRlcyAqLworICAgIF9fbGUzMiBjcnlwdF90eXBlOyAgICAgICAgICAgLyogaG93IG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkLiBNdXN0IGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIENSWVBUX1RZUEVfWFhYIHZhbHVlICovCisgICAgX19sZTY0IGZzX3NpemU7ICAgICAgICAgICAgICAvKiBTaXplIG9mIHRoZSBlbmNyeXB0ZWQgZnMsIGluIDUxMiBieXRlIHNlY3RvcnMgKi8KKyAgICBfX2xlMzIgZmFpbGVkX2RlY3J5cHRfY291bnQ7IC8qIGNvdW50IG9mICMgb2YgZmFpbGVkIGF0dGVtcHRzIHRvIGRlY3J5cHQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudCwgc2V0IHRvIDAgb24gc3VjY2Vzc2Z1bCBtb3VudCAqLworICAgIHVuc2lnbmVkIGNoYXIgY3J5cHRvX3R5cGVfbmFtZVtNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU5dOyAvKiBUaGUgdHlwZSBvZiBlbmNyeXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCB0byBkZWNyeXB0IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uLCBudWxsIHRlcm1pbmF0ZWQgKi8KKyAgICBfX2xlMzIgc3BhcmUyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWdub3JlZCAqLworICAgIHVuc2lnbmVkIGNoYXIgbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07IC8qIFRoZSBlbmNyeXB0ZWQga2V5IGZvciBkZWNyeXB0aW5nIHRoZSBmaWxlc3lzdGVtICovCisgICAgdW5zaWduZWQgY2hhciBzYWx0W1NBTFRfTEVOXTsgICAgICAgICAgLyogVGhlIHNhbHQgdXNlZCBmb3IgdGhpcyBlbmNyeXB0aW9uICovCisgICAgX19sZTY0IHBlcnNpc3RfZGF0YV9vZmZzZXRbMl07ICAgICAgICAgLyogQWJzb2x1dGUgb2Zmc2V0IHRvIGJvdGggY29waWVzIG9mIGNyeXB0X3BlcnNpc3RfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9uIGRldmljZSB3aXRoIHRoYXQgaW5mbywgZWl0aGVyIHRoZSBmb290ZXIgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVhbF9ibGtkZXZpY2Ugb3IgdGhlIG1ldGFkYXRhIHBhcnRpdGlvbi4gKi8KIAotICBfX2xlMzIgcGVyc2lzdF9kYXRhX3NpemU7ICAgICAgIC8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIHRvIGVhY2ggY29weSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwZXJzaXN0ZW50IGRhdGEgdGFibGUqLworICAgIF9fbGUzMiBwZXJzaXN0X2RhdGFfc2l6ZTsgLyogVGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgdG8gZWFjaCBjb3B5IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGVyc2lzdGVudCBkYXRhIHRhYmxlKi8KIAotICBfX2xlOCAga2RmX3R5cGU7IC8qIFRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB1c2VkLiAqLworICAgIF9fbGU4IGtkZl90eXBlOyAvKiBUaGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gdXNlZC4gKi8KIAotICAvKiBzY3J5cHQgcGFyYW1ldGVycy4gU2VlIHd3dy50YXJzbmFwLmNvbS9zY3J5cHQvc2NyeXB0LnBkZiAqLwotICBfX2xlOCAgTl9mYWN0b3I7IC8qICgxIDw8IE4pICovCi0gIF9fbGU4ICByX2ZhY3RvcjsgLyogKDEgPDwgcikgKi8KLSAgX19sZTggIHBfZmFjdG9yOyAvKiAoMSA8PCBwKSAqLwotICBfX2xlNjQgZW5jcnlwdGVkX3VwdG87IC8qIElmIHdlIGFyZSBpbiBzdGF0ZSBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIGhhdmUgdG8gc3RvcCAoZS5nLiBwb3dlciBsb3cpIHRoaXMgaXMgdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgNTEyIGJ5dGUgc2VjdG9yLiovCi0gIF9fbGU4ICBoYXNoX2ZpcnN0X2Jsb2NrW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsgLyogV2hlbiBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LCBoYXNoIG9mIGZpcnN0IGJsb2NrLCB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdmFsaWRhdGUgYmVmb3JlIGNvbnRpbnVpbmcqLworICAgIC8qIHNjcnlwdCBwYXJhbWV0ZXJzLiBTZWUgd3d3LnRhcnNuYXAuY29tL3NjcnlwdC9zY3J5cHQucGRmICovCisgICAgX19sZTggTl9mYWN0b3I7ICAgICAgICAvKiAoMSA8PCBOKSAqLworICAgIF9fbGU4IHJfZmFjdG9yOyAgICAgICAgLyogKDEgPDwgcikgKi8KKyAgICBfX2xlOCBwX2ZhY3RvcjsgICAgICAgIC8qICgxIDw8IHApICovCisgICAgX19sZTY0IGVuY3J5cHRlZF91cHRvOyAvKiBJZiB3ZSBhcmUgaW4gc3RhdGUgQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIGhhdmUgdG8gc3RvcCAoZS5nLiBwb3dlciBsb3cpIHRoaXMgaXMgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCA1MTIgYnl0ZSBzZWN0b3IuKi8KKyAgICBfX2xlOCBoYXNoX2ZpcnN0X2Jsb2NrW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsgLyogV2hlbiBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgaGFzaCBvZiBmaXJzdCBibG9jaywgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB2YWxpZGF0ZSBiZWZvcmUgY29udGludWluZyovCiAKLSAgLyoga2V5X21hc3RlciBrZXksIHVzZWQgdG8gc2lnbiB0aGUgZGVyaXZlZCBrZXkgd2hpY2ggaXMgdGhlbiB1c2VkIHRvIGdlbmVyYXRlCi0gICAqIHRoZSBpbnRlcm1lZGlhdGUga2V5Ci0gICAqIFRoaXMga2V5IHNob3VsZCBiZSB1c2VkIGZvciBubyBvdGhlciBwdXJwb3NlcyEgV2UgdXNlIHRoaXMga2V5IHRvIHNpZ24gdW5wYWRkZWQgCi0gICAqIGRhdGEsIHdoaWNoIGlzIGFjY2VwdGFibGUgYnV0IG9ubHkgaWYgdGhlIGtleSBpcyBub3QgcmV1c2VkIGVsc2V3aGVyZS4gKi8KLSAgX19sZTgga2V5bWFzdGVyX2Jsb2JbS0VZTUFTVEVSX0JMT0JfU0laRV07Ci0gIF9fbGUzMiBrZXltYXN0ZXJfYmxvYl9zaXplOworICAgIC8qIGtleV9tYXN0ZXIga2V5LCB1c2VkIHRvIHNpZ24gdGhlIGRlcml2ZWQga2V5IHdoaWNoIGlzIHRoZW4gdXNlZCB0byBnZW5lcmF0ZQorICAgICAqIHRoZSBpbnRlcm1lZGlhdGUga2V5CisgICAgICogVGhpcyBrZXkgc2hvdWxkIGJlIHVzZWQgZm9yIG5vIG90aGVyIHB1cnBvc2VzISBXZSB1c2UgdGhpcyBrZXkgdG8gc2lnbiB1bnBhZGRlZAorICAgICAqIGRhdGEsIHdoaWNoIGlzIGFjY2VwdGFibGUgYnV0IG9ubHkgaWYgdGhlIGtleSBpcyBub3QgcmV1c2VkIGVsc2V3aGVyZS4gKi8KKyAgICBfX2xlOCBrZXltYXN0ZXJfYmxvYltLRVlNQVNURVJfQkxPQl9TSVpFXTsKKyAgICBfX2xlMzIga2V5bWFzdGVyX2Jsb2Jfc2l6ZTsKIAotICAvKiBTdG9yZSBzY3J5cHQgb2Ygc2FsdGVkIGludGVybWVkaWF0ZSBrZXkuIFdoZW4gZGVjcnlwdGlvbiBmYWlscywgd2UgY2FuCi0gICAgIGNoZWNrIGlmIHRoaXMgbWF0Y2hlcywgYW5kIGlmIGl0IGRvZXMsIHdlIGtub3cgdGhhdCB0aGUgcHJvYmxlbSBpcyB3aXRoIHRoZQotICAgICBkcml2ZSwgYW5kIHRoZXJlIGlzIG5vIHBvaW50IGluIGFza2luZyB0aGUgdXNlciBmb3IgbW9yZSBwYXNzd29yZHMuCisgICAgLyogU3RvcmUgc2NyeXB0IG9mIHNhbHRlZCBpbnRlcm1lZGlhdGUga2V5LiBXaGVuIGRlY3J5cHRpb24gZmFpbHMsIHdlIGNhbgorICAgICAgIGNoZWNrIGlmIHRoaXMgbWF0Y2hlcywgYW5kIGlmIGl0IGRvZXMsIHdlIGtub3cgdGhhdCB0aGUgcHJvYmxlbSBpcyB3aXRoIHRoZQorICAgICAgIGRyaXZlLCBhbmQgdGhlcmUgaXMgbm8gcG9pbnQgaW4gYXNraW5nIHRoZSB1c2VyIGZvciBtb3JlIHBhc3N3b3Jkcy4KIAotICAgICBOb3RlIHRoYXQgaWYgYW55IHBhcnQgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgY29ycnVwdCwgdGhpcyB3aWxsIG5vdCBtYXRjaCBhbmQKLSAgICAgd2Ugd2lsbCBjb250aW51ZSB0byBiZWxpZXZlIHRoZSB1c2VyIGVudGVyZWQgdGhlIHdyb25nIHBhc3N3b3JkLiBJbiB0aGF0Ci0gICAgIGNhc2UgdGhlIG9ubHkgc29sdXRpb24gaXMgZm9yIHRoZSB1c2VyIHRvIGVudGVyIGEgcGFzc3dvcmQgZW5vdWdoIHRpbWVzIHRvCi0gICAgIGZvcmNlIGEgd2lwZS4KKyAgICAgICBOb3RlIHRoYXQgaWYgYW55IHBhcnQgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgY29ycnVwdCwgdGhpcyB3aWxsIG5vdCBtYXRjaCBhbmQKKyAgICAgICB3ZSB3aWxsIGNvbnRpbnVlIHRvIGJlbGlldmUgdGhlIHVzZXIgZW50ZXJlZCB0aGUgd3JvbmcgcGFzc3dvcmQuIEluIHRoYXQKKyAgICAgICBjYXNlIHRoZSBvbmx5IHNvbHV0aW9uIGlzIGZvciB0aGUgdXNlciB0byBlbnRlciBhIHBhc3N3b3JkIGVub3VnaCB0aW1lcyB0bworICAgICAgIGZvcmNlIGEgd2lwZS4KIAotICAgICBOb3RlIGFsc28gdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IG1pZ3JhdGlvbi4gSWYgdGhpcyBkYXRhIGlzCi0gICAgIHdyb25nLCB3ZSBzaW1wbHkgd29uJ3QgcmVjb2duaXNlIGEgcmlnaHQgcGFzc3dvcmQsIGFuZCB3aWxsIGNvbnRpbnVlIHRvCi0gICAgIHByb21wdC4gT24gdGhlIGZpcnN0IHBhc3N3b3JkIGNoYW5nZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIHBvcHVsYXRlZCBhbmQKLSAgICAgdGhlbiB3ZSB3aWxsIGJlIE9LLgotICAgKi8KLSAgdW5zaWduZWQgY2hhciBzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5W1NDUllQVF9MRU5dOworICAgICAgIE5vdGUgYWxzbyB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgbWlncmF0aW9uLiBJZiB0aGlzIGRhdGEgaXMKKyAgICAgICB3cm9uZywgd2Ugc2ltcGx5IHdvbid0IHJlY29nbmlzZSBhIHJpZ2h0IHBhc3N3b3JkLCBhbmQgd2lsbCBjb250aW51ZSB0bworICAgICAgIHByb21wdC4gT24gdGhlIGZpcnN0IHBhc3N3b3JkIGNoYW5nZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIHBvcHVsYXRlZCBhbmQKKyAgICAgICB0aGVuIHdlIHdpbGwgYmUgT0suCisgICAgICovCisgICAgdW5zaWduZWQgY2hhciBzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5W1NDUllQVF9MRU5dOwogCi0gIC8qIHNoYSBvZiB0aGlzIHN0cnVjdHVyZSB3aXRoIHRoaXMgZWxlbWVudCBzZXQgdG8gemVybwotICAgICBVc2VkIHdoZW4gZW5jcnlwdGluZyBvbiByZWJvb3QgdG8gdmFsaWRhdGUgc3RydWN0dXJlIGJlZm9yZSBkb2luZyBzb21ldGhpbmcKLSAgICAgZmF0YWwKLSAgICovCi0gIHVuc2lnbmVkIGNoYXIgc2hhMjU2W1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKKyAgICAvKiBzaGEgb2YgdGhpcyBzdHJ1Y3R1cmUgd2l0aCB0aGlzIGVsZW1lbnQgc2V0IHRvIHplcm8KKyAgICAgICBVc2VkIHdoZW4gZW5jcnlwdGluZyBvbiByZWJvb3QgdG8gdmFsaWRhdGUgc3RydWN0dXJlIGJlZm9yZSBkb2luZyBzb21ldGhpbmcKKyAgICAgICBmYXRhbAorICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgc2hhMjU2W1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKIH07CiAKIC8qIFBlcnNpc3RhbnQgZGF0YSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgYmVmb3JlIGRlY3J5cHRpb24uCkBAIC0xODAsNDkgKzE4Nyw0OSBAQAogICogYW5kIGhpZ2hlciBjcnlwdF9tbnRfZnRyIHN0cnVjdHVyZXMuCiAgKi8KIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2VudHJ5IHsKLSAgY2hhciBrZXlbUFJPUEVSVFlfS0VZX01BWF07Ci0gIGNoYXIgdmFsW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgY2hhciBrZXlbUFJPUEVSVFlfS0VZX01BWF07CisgICAgY2hhciB2YWxbUFJPUEVSVFlfVkFMVUVfTUFYXTsKIH07CiAKIC8qIFNob3VsZCBiZSBleGFjdGx5IDRLIGluIHNpemUgKi8KIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEgewotICBfX2xlMzIgcGVyc2lzdF9tYWdpYzsKLSAgX19sZTMyIHBlcnNpc3RfdmFsaWRfZW50cmllczsKLSAgX19sZTMyIHBlcnNpc3Rfc3BhcmVbMzBdOwotICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9lbnRyeSBwZXJzaXN0X2VudHJ5WzBdOworICAgIF9fbGUzMiBwZXJzaXN0X21hZ2ljOworICAgIF9fbGUzMiBwZXJzaXN0X3ZhbGlkX2VudHJpZXM7CisgICAgX19sZTMyIHBlcnNpc3Rfc3BhcmVbMzBdOworICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2VudHJ5IHBlcnNpc3RfZW50cnlbMF07CiB9OwogCiAjZGVmaW5lIERBVEFfTU5UX1BPSU5UICIvZGF0YSIKIAogLyogUmV0dXJuIHZhbHVlcyBmb3IgY3J5cHRmc19jcnlwdG9fY29tcGxldGUgKi8KLSNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQgIDEKLSNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0VOQ1JZUFRFRCAgICAgIDAKLSNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0JBRF9NRVRBREFUQSAgKC0xKQotI2RlZmluZSBDUllQVE9fQ09NUExFVEVfUEFSVElBTCAgICAgICAoLTIpCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9JTkNPTlNJU1RFTlQgICgtMykKLSNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0NPUlJVUFQgICAgICAgKC00KQorI2RlZmluZSBDUllQVE9fQ09NUExFVEVfTk9UX0VOQ1JZUFRFRCAxCisjZGVmaW5lIENSWVBUT19DT01QTEVURV9FTkNSWVBURUQgMAorI2RlZmluZSBDUllQVE9fQ09NUExFVEVfQkFEX01FVEFEQVRBICgtMSkKKyNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX1BBUlRJQUwgKC0yKQorI2RlZmluZSBDUllQVE9fQ09NUExFVEVfSU5DT05TSVNURU5UICgtMykKKyNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0NPUlJVUFQgKC00KQogCiAvKiBSZXR1cm4gdmFsdWVzIGZvciBjcnlwdGZzX2VuYWJsZV9pbnBsYWNlKigpICovCiAjZGVmaW5lIEVOQUJMRV9JTlBMQUNFX09LIDAKICNkZWZpbmUgRU5BQkxFX0lOUExBQ0VfRVJSX09USEVSICgtMSkKLSNkZWZpbmUgRU5BQkxFX0lOUExBQ0VfRVJSX0RFViAoLTIpICAvKiBjcnlwdG9fYmxrZGV2IGlzc3VlICovCisjZGVmaW5lIEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYgKC0yKSAvKiBjcnlwdG9fYmxrZGV2IGlzc3VlICovCiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIGNyeXB0ZnNfZ2V0ZmllbGQgKi8KLSNkZWZpbmUgQ1JZUFRPX0dFVEZJRUxEX09LICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX05PX0ZJRUxEICAgICAgKC0xKQotI2RlZmluZSBDUllQVE9fR0VURklFTERfRVJST1JfT1RIRVIgICAgICAgICAoLTIpCisjZGVmaW5lIENSWVBUT19HRVRGSUVMRF9PSyAwCisjZGVmaW5lIENSWVBUT19HRVRGSUVMRF9FUlJPUl9OT19GSUVMRCAoLTEpCisjZGVmaW5lIENSWVBUT19HRVRGSUVMRF9FUlJPUl9PVEhFUiAoLTIpCiAjZGVmaW5lIENSWVBUT19HRVRGSUVMRF9FUlJPUl9CVUZfVE9PX1NNQUxMICgtMykKIAogLyogUmV0dXJuIHZhbHVlcyBmb3IgY3J5cHRmc19zZXRmaWVsZCAqLwotI2RlZmluZSBDUllQVE9fU0VURklFTERfT0sgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQ1JZUFRPX1NFVEZJRUxEX0VSUk9SX09USEVSICAgICAgICAgICgtMSkKKyNkZWZpbmUgQ1JZUFRPX1NFVEZJRUxEX09LIDAKKyNkZWZpbmUgQ1JZUFRPX1NFVEZJRUxEX0VSUk9SX09USEVSICgtMSkKICNkZWZpbmUgQ1JZUFRPX1NFVEZJRUxEX0VSUk9SX0ZJRUxEX1RPT19MT05HICgtMikKICNkZWZpbmUgQ1JZUFRPX1NFVEZJRUxEX0VSUk9SX1ZBTFVFX1RPT19MT05HICgtMykKIAogLyogUmV0dXJuIHZhbHVlcyBmb3IgcGVyc2lzdF9kZWxfa2V5ICovCi0jZGVmaW5lIFBFUlNJU1RfREVMX0tFWV9PSyAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQRVJTSVNUX0RFTF9LRVlfRVJST1JfT1RIRVIgICAgICAgKC0xKQotI2RlZmluZSBQRVJTSVNUX0RFTF9LRVlfRVJST1JfTk9fRklFTEQgICAgKC0yKQorI2RlZmluZSBQRVJTSVNUX0RFTF9LRVlfT0sgMAorI2RlZmluZSBQRVJTSVNUX0RFTF9LRVlfRVJST1JfT1RIRVIgKC0xKQorI2RlZmluZSBQRVJTSVNUX0RFTF9LRVlfRVJST1JfTk9fRklFTEQgKC0yKQogCiBpbnQgbWF0Y2hfbXVsdGlfZW50cnkoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiBmaWVsZCwgdW5zaWduZWQgaW5kZXgpOwogaW50IHdhaXRfYW5kX3VubW91bnQoY29uc3QgY2hhciogbW91bnRwb2ludCwgYm9vbCBraWxsKTsKZGlmZiAtLWdpdCBhL2ZzL0V4dDQuY3BwIGIvZnMvRXh0NC5jcHAKaW5kZXggNzE3YzhiNy4uN2FjNDg1MyAxMDA2NDQKLS0tIGEvZnMvRXh0NC5jcHAKKysrIGIvZnMvRXh0NC5jcHAKQEAgLTE0LDIzICsxNCwyMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgpAQCAtNTksOSArNTYsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIqIGtGc2NrUGF0aCA9ICIvc3lzdGVtL2Jpbi9lMmZzY2siOwogCiBib29sIElzU3VwcG9ydGVkKCkgewotICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImV4dDQiKTsKKyAgICByZXR1cm4gYWNjZXNzKGtNa2ZzUGF0aCwgWF9PSykgPT0gMCAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwICYmCisgICAgICAgICAgIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZXh0NCIpOwogfQogCiBzdGF0dXNfdCBDaGVjayhjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0KSB7CkBAIC03NCw3ICs3MCw3IEBACiAgICAgaW50IHN0YXR1czsKICAgICBpbnQgcmV0OwogICAgIGxvbmcgdG1wbW50X2ZsYWdzID0gTVNfTk9BVElNRSB8IE1TX05PRVhFQyB8IE1TX05PU1VJRDsKLSAgICBjaGFyICp0bXBtbnRfb3B0cyA9IChjaGFyKikgIm5vbWJsa19pb19zdWJtaXQsZXJyb3JzPXJlbW91bnQtcm8iOworICAgIGNoYXIqIHRtcG1udF9vcHRzID0gKGNoYXIqKSJub21ibGtfaW9fc3VibWl0LGVycm9ycz1yZW1vdW50LXJvIjsKIAogICAgIC8qCiAgICAgICogRmlyc3QgdHJ5IHRvIG1vdW50IGFuZCB1bm1vdW50IHRoZSBmaWxlc3lzdGVtLiAgV2UgZG8gdGhpcyBiZWNhdXNlCkBAIC0xMjcsOCArMTIzLDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywKLSAgICAgICAgYm9vbCByZW1vdW50LCBib29sIGV4ZWN1dGFibGUpIHsKK3N0YXR1c190IE1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGJvb2wgcm8sIGJvb2wgcmVtb3VudCwKKyAgICAgICAgICAgICAgIGJvb2wgZXhlY3V0YWJsZSkgewogICAgIGludCByYzsKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xNjIsOCArMTU4LDcgQEAKICAgICByZXR1cm4gRm9ya0V4ZWN2cChjbWQpOwogfQogCi1zdGF0dXNfdCBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0KSB7CitzdGF0dXNfdCBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0KSB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNtZDsKICAgICBjbWQucHVzaF9iYWNrKGtNa2ZzUGF0aCk7CiAKZGlmZiAtLWdpdCBhL2ZzL0V4dDQuaCBiL2ZzL0V4dDQuaAppbmRleCBmNzhkYzk1Li4zMjlmMzAyIDEwMDY0NAotLS0gYS9mcy9FeHQ0LmgKKysrIGIvZnMvRXh0NC5oCkBAIC0yOCwxMCArMjgsOSBAQAogYm9vbCBJc1N1cHBvcnRlZCgpOwogCiBzdGF0dXNfdCBDaGVjayhjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0KTsKLXN0YXR1c190IE1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGJvb2wgcm8sCi0gICAgICAgIGJvb2wgcmVtb3VudCwgYm9vbCBleGVjdXRhYmxlKTsKLXN0YXR1c190IEZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQpOworc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywgYm9vbCByZW1vdW50LAorICAgICAgICAgICAgICAgYm9vbCBleGVjdXRhYmxlKTsKK3N0YXR1c190IEZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQpOwogc3RhdHVzX3QgUmVzaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycyk7CiAKIH0gIC8vIG5hbWVzcGFjZSBleHQ0CmRpZmYgLS1naXQgYS9mcy9GMmZzLmNwcCBiL2ZzL0YyZnMuY3BwCmluZGV4IGYyNGZkOTEuLjlkNzI5NjMgMTAwNjQ0Ci0tLSBhL2ZzL0YyZnMuY3BwCisrKyBiL2ZzL0YyZnMuY3BwCkBAIC0yMiw4ICsyMiw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF9jcnlwdC5oPgogCi0jaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KIApAQCAtMzcsOSArMzcsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIqIGtGc2NrUGF0aCA9ICIvc3lzdGVtL2Jpbi9mc2NrLmYyZnMiOwogCiBib29sIElzU3VwcG9ydGVkKCkgewotICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImYyZnMiKTsKKyAgICByZXR1cm4gYWNjZXNzKGtNa2ZzUGF0aCwgWF9PSykgPT0gMCAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwICYmCisgICAgICAgICAgIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZjJmcyIpOwogfQogCiBzdGF0dXNfdCBDaGVjayhjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlKSB7CmRpZmYgLS1naXQgYS9mcy9WZmF0LmNwcCBiL2ZzL1ZmYXQuY3BwCmluZGV4IDk4NzNmZDQuLjdiODMzZDEgMTAwNjQ0Ci0tLSBhL2ZzL1ZmYXQuY3BwCisrKyBiL2ZzL1ZmYXQuY3BwCkBAIC0xNCwyNCArMTQsMjEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvbW91bnQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KIApAQCAtNDEsOCArMzgsOCBAQAogCiAjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAKLSNpbmNsdWRlICJWZmF0LmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJWZmF0LmgiCiAjaW5jbHVkZSAiVm9sZFV0aWwuaCIKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwpAQCAtNTUsOSArNTIsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIqIGtGc2NrUGF0aCA9ICIvc3lzdGVtL2Jpbi9mc2NrX21zZG9zIjsKIAogYm9vbCBJc1N1cHBvcnRlZCgpIHsKLSAgICByZXR1cm4gYWNjZXNzKGtNa2ZzUGF0aCwgWF9PSykgPT0gMAotICAgICAgICAgICAgJiYgYWNjZXNzKGtGc2NrUGF0aCwgWF9PSykgPT0gMAotICAgICAgICAgICAgJiYgSXNGaWxlc3lzdGVtU3VwcG9ydGVkKCJ2ZmF0Iik7CisgICAgcmV0dXJuIGFjY2VzcyhrTWtmc1BhdGgsIFhfT0spID09IDAgJiYgYWNjZXNzKGtGc2NrUGF0aCwgWF9PSykgPT0gMCAmJgorICAgICAgICAgICBJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoInZmYXQiKTsKIH0KIAogc3RhdHVzX3QgQ2hlY2soY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSkgewpAQCAtNzksNDMgKzc1LDQyIEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAotICAgICAgICBzd2l0Y2gocmMpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGNvbXBsZXRlZCBPSyI7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3dpdGNoIChyYykgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBjb21wbGV0ZWQgT0siOworICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgZmFpbGVkIChub3QgYSBGQVQgZmlsZXN5c3RlbSkiOwotICAgICAgICAgICAgZXJybm8gPSBFTk9EQVRBOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgZmFpbGVkIChub3QgYSBGQVQgZmlsZXN5c3RlbSkiOworICAgICAgICAgICAgICAgIGVycm5vID0gRU5PREFUQTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgaWYgKHBhc3MrKyA8PSAzKSB7Ci0gICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGaWxlc3lzdGVtIG1vZGlmaWVkIC0gcmVjaGVja2luZyAocGFzcyAiIDw8IHBhc3MgPDwgIikiOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGluZyBjaGVjayBhZnRlciB0b28gbWFueSByZWNoZWNrcyI7Ci0gICAgICAgICAgICBlcnJubyA9IEVJTzsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBpZiAocGFzcysrIDw9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGaWxlc3lzdGVtIG1vZGlmaWVkIC0gcmVjaGVja2luZyAocGFzcyAiIDw8IHBhc3MgPDwgIikiOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGluZyBjaGVjayBhZnRlciB0b28gbWFueSByZWNoZWNrcyI7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgZmFpbGVkIChubyBmaWxlc3lzdGVtKSI7Ci0gICAgICAgICAgICBlcnJubyA9IEVOT0RBVEE7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQgKG5vIGZpbGVzeXN0ZW0pIjsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVOT0RBVEE7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGZhaWxlZCAodW5rbm93biBleGl0IGNvZGUgIiA8PCByYyA8PCAiKSI7Ci0gICAgICAgICAgICBlcnJubyA9IEVJTzsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQgKHVua25vd24gZXhpdCBjb2RlICIgPDwgcmMgPDwgIikiOworICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0gd2hpbGUgKDApOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXR1c190IE1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGJvb2wgcm8sCi0gICAgICAgIGJvb2wgcmVtb3VudCwgYm9vbCBleGVjdXRhYmxlLCBpbnQgb3duZXJVaWQsIGludCBvd25lckdpZCwgaW50IHBlcm1NYXNrLAotICAgICAgICBib29sIGNyZWF0ZUxvc3QpIHsKK3N0YXR1c190IE1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGJvb2wgcm8sIGJvb2wgcmVtb3VudCwKKyAgICAgICAgICAgICAgIGJvb2wgZXhlY3V0YWJsZSwgaW50IG93bmVyVWlkLCBpbnQgb3duZXJHaWQsIGludCBwZXJtTWFzaywgYm9vbCBjcmVhdGVMb3N0KSB7CiAgICAgaW50IHJjOwogICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEyOCw5ICsxMjMsOSBAQAogICAgIGZsYWdzIHw9IChybyA/IE1TX1JET05MWSA6IDApOwogICAgIGZsYWdzIHw9IChyZW1vdW50ID8gTVNfUkVNT1VOVCA6IDApOwogCi0gICAgYXV0byBtb3VudERhdGEgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAidXRmOCx1aWQ9JWQsZ2lkPSVkLGZtYXNrPSVvLGRtYXNrPSVvLHNob3J0bmFtZT1taXhlZCIsCi0gICAgICAgICAgICBvd25lclVpZCwgb3duZXJHaWQsIHBlcm1NYXNrLCBwZXJtTWFzayk7CisgICAgYXV0byBtb3VudERhdGEgPQorICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoInV0ZjgsdWlkPSVkLGdpZD0lZCxmbWFzaz0lbyxkbWFzaz0lbyxzaG9ydG5hbWU9bWl4ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJVaWQsIG93bmVyR2lkLCBwZXJtTWFzaywgcGVybU1hc2spOwogCiAgICAgcmMgPSBtb3VudChjX3NvdXJjZSwgY190YXJnZXQsICJ2ZmF0IiwgZmxhZ3MsIG1vdW50RGF0YS5jX3N0cigpKTsKIApkaWZmIC0tZ2l0IGEvZnMvVmZhdC5oIGIvZnMvVmZhdC5oCmluZGV4IDQwYmU1ZjYuLjIwMzAwNjcgMTAwNjQ0Ci0tLSBhL2ZzL1ZmYXQuaAorKysgYi9mcy9WZmF0LmgKQEAgLTI4LDkgKzI4LDggQEAKIGJvb2wgSXNTdXBwb3J0ZWQoKTsKIAogc3RhdHVzX3QgQ2hlY2soY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSk7Ci1zdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLAotICAgICAgICBib29sIHJlbW91bnQsIGJvb2wgZXhlY3V0YWJsZSwgaW50IG93bmVyVWlkLCBpbnQgb3duZXJHaWQsIGludCBwZXJtTWFzaywKLSAgICAgICAgYm9vbCBjcmVhdGVMb3N0KTsKK3N0YXR1c190IE1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGJvb2wgcm8sIGJvb2wgcmVtb3VudCwKKyAgICAgICAgICAgICAgIGJvb2wgZXhlY3V0YWJsZSwgaW50IG93bmVyVWlkLCBpbnQgb3duZXJHaWQsIGludCBwZXJtTWFzaywgYm9vbCBjcmVhdGVMb3N0KTsKIHN0YXR1c190IEZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpOwogCiB9ICAvLyBuYW1lc3BhY2UgdmZhdApkaWZmIC0tZ2l0IGEvaGFzaC5oIGIvaGFzaC5oCmluZGV4IDNiNDgzZjEuLmNkODE4MDUgMTAwNjQ0Ci0tLSBhL2hhc2guaAorKysgYi9oYXNoLmgKQEAgLTEsMTggKzEsMTggQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCi0gKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgogICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIAotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAqCiAgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEtUSCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCiAgKiAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoKGEpPihiKSk/KGIpOihhKSkKKyNkZWZpbmUgbWluKGEsIGIpICgoKGEpID4gKGIpKSA/IChiKSA6IChhKSkKICNlbmRpZgogCiAvKiBWZWN0b3IgQ3JheXMgZG9lc24ndCBoYXZlIGEgZ29vZCAzMi1iaXQgdHlwZSwgb3IgbW9yZSBwcmVjaXNlbHksCkBAIC01MywxNCArNTMsMTIgQEAKICAgICovCiAKICNpZmRlZiBfQ1JBWQotI2RlZmluZSBDUkFZRklYKFgpICgoWCkgJiAweGZmZmZmZmZmKQorI2RlZmluZSBDUkFZRklYKFgpICgoWCkmMHhmZmZmZmZmZikKICNlbHNlCiAjZGVmaW5lIENSQVlGSVgoWCkgKFgpCiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB1X2ludDMyX3QKLWNzaGlmdCAodV9pbnQzMl90IHgsIHVuc2lnbmVkIGludCBuKQoteworc3RhdGljIGlubGluZSB1X2ludDMyX3QgY3NoaWZ0KHVfaW50MzJfdCB4LCB1bnNpZ25lZCBpbnQgbikgewogICAgIHggPSBDUkFZRklYKHgpOwogICAgIHJldHVybiBDUkFZRklYKCh4IDw8IG4pIHwgKHggPj4gKDMyIC0gbikpKTsKIH0KZGlmZiAtLWdpdCBhL21haW4uY3BwIGIvbWFpbi5jcHAKaW5kZXggYzQwNzFkMS4uNTJhYmYyMCAxMDA2NDQKLS0tIGEvbWFpbi5jcHAKKysrIGIvbWFpbi5jcHAKQEAgLTE2LDEyICsxNiwxMiBAQAogCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19QQUNLQUdFX01BTkFHRVIKIAotI2luY2x1ZGUgIm1vZGVsL0Rpc2suaCIKLSNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiTmV0bGlua01hbmFnZXIuaCIKICNpbmNsdWRlICJWb2xkTmF0aXZlU2VydmljZS5oIgogI2luY2x1ZGUgIlZvbGRVdGlsLmgiCisjaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgogI2luY2x1ZGUgImNyeXB0ZnMuaCIKKyNpbmNsdWRlICJtb2RlbC9EaXNrLmgiCiAjaW5jbHVkZSAic2VoYW5kbGUuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CkBAIC0zMSwyMyArMzEsMjMgQEAKICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGZzX21nci5oPgogCiBzdGF0aWMgaW50IHByb2Nlc3NfY29uZmlnKFZvbHVtZU1hbmFnZXIqIHZtLCBib29sKiBoYXNfYWRvcHRhYmxlLCBib29sKiBoYXNfcXVvdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGhhc19yZXNlcnZlZCk7Ci1zdGF0aWMgdm9pZCBjb2xkYm9vdChjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyB2b2lkIGNvbGRib290KGNvbnN0IGNoYXIqIHBhdGgpOwogc3RhdGljIHZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpOwogCi1zdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlaGFuZGxlOworc3RydWN0IHNlbGFiZWxfaGFuZGxlKiBzZWhhbmRsZTsKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogCkBAIC02MCwxNCArNjAsMTMgQEAKIAogICAgIEFUUkFDRV9CRUdJTigibWFpbiIpOwogCi0KICAgICBMT0coVkVSQk9TRSkgPDwgIkRldGVjdGVkIHN1cHBvcnQgZm9yOiIKLSAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImV4dDQiKSA/ICIgZXh0NCIgOiAiIikKLSAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImYyZnMiKSA/ICIgZjJmcyIgOiAiIikKLSAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoInZmYXQiKSA/ICIgdmZhdCIgOiAiIik7CisgICAgICAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImV4dDQiKSA/ICIgZXh0NCIgOiAiIikKKyAgICAgICAgICAgICAgICAgPDwgKGFuZHJvaWQ6OnZvbGQ6OklzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZjJmcyIpID8gIiBmMmZzIiA6ICIiKQorICAgICAgICAgICAgICAgICA8PCAoYW5kcm9pZDo6dm9sZDo6SXNGaWxlc3lzdGVtU3VwcG9ydGVkKCJ2ZmF0IikgPyAiIHZmYXQiIDogIiIpOwogCi0gICAgVm9sdW1lTWFuYWdlciAqdm07Ci0gICAgTmV0bGlua01hbmFnZXIgKm5tOworICAgIFZvbHVtZU1hbmFnZXIqIHZtOworICAgIE5ldGxpbmtNYW5hZ2VyKiBubTsKIAogICAgIHBhcnNlX2FyZ3MoYXJnYywgYXJndik7CiAKQEAgLTE0OCwxOSArMTQ3LDIxIEBACiAKIHN0YXRpYyB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0gewotICAgICAgICB7ImJsa2lkX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2InIH0sCi0gICAgICAgIHsiYmxraWRfdW50cnVzdGVkX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0InIH0sCi0gICAgICAgIHsiZnNja19jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJyB9LAotICAgICAgICB7ImZzY2tfdW50cnVzdGVkX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnIH0sCisgICAgICAgIHsiYmxraWRfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYid9LAorICAgICAgICB7ImJsa2lkX3VudHJ1c3RlZF9jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdCJ30sCisgICAgICAgIHsiZnNja19jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJ30sCisgICAgICAgIHsiZnNja191bnRydXN0ZWRfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAogICAgIH07CiAKICAgICBpbnQgYzsKICAgICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiIiwgb3B0cywgbnVsbHB0cikpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgICAgICBjYXNlICdiJzogYW5kcm9pZDo6dm9sZDo6c0Jsa2lkQ29udGV4dCA9IG9wdGFyZzsgYnJlYWs7CiAgICAgICAgIGNhc2UgJ0InOiBhbmRyb2lkOjp2b2xkOjpzQmxraWRVbnRydXN0ZWRDb250ZXh0ID0gb3B0YXJnOyBicmVhazsKICAgICAgICAgY2FzZSAnZic6IGFuZHJvaWQ6OnZvbGQ6OnNGc2NrQ29udGV4dCA9IG9wdGFyZzsgYnJlYWs7CiAgICAgICAgIGNhc2UgJ0YnOiBhbmRyb2lkOjp2b2xkOjpzRnNja1VudHJ1c3RlZENvbnRleHQgPSBvcHRhcmc7IGJyZWFrOworICAgICAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzAsMzMgKzE3MSwzMCBAQAogICAgIENIRUNLKGFuZHJvaWQ6OnZvbGQ6OnNGc2NrVW50cnVzdGVkQ29udGV4dCAhPSBudWxscHRyKTsKIH0KIAotc3RhdGljIHZvaWQgZG9fY29sZGJvb3QoRElSICpkLCBpbnQgbHZsKSB7Ci0gICAgc3RydWN0IGRpcmVudCAqZGU7CitzdGF0aWMgdm9pZCBkb19jb2xkYm9vdChESVIqIGQsIGludCBsdmwpIHsKKyAgICBzdHJ1Y3QgZGlyZW50KiBkZTsKICAgICBpbnQgZGZkLCBmZDsKIAogICAgIGRmZCA9IGRpcmZkKGQpOwogCiAgICAgZmQgPSBvcGVuYXQoZGZkLCAidWV2ZW50IiwgT19XUk9OTFkgfCBPX0NMT0VYRUMpOwotICAgIGlmKGZkID49IDApIHsKKyAgICBpZiAoZmQgPj0gMCkgewogICAgICAgICB3cml0ZShmZCwgImFkZFxuIiwgNCk7CiAgICAgICAgIGNsb3NlKGZkKTsKICAgICB9CiAKLSAgICB3aGlsZSgoZGUgPSByZWFkZGlyKGQpKSkgewotICAgICAgICBESVIgKmQyOworICAgIHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkgeworICAgICAgICBESVIqIGQyOwogCi0gICAgICAgIGlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpIGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChkZS0+ZF90eXBlICE9IERUX0RJUiAmJiBsdmwgPiAwKQotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChkZS0+ZF90eXBlICE9IERUX0RJUiAmJiBsdmwgPiAwKSBjb250aW51ZTsKIAogICAgICAgICBmZCA9IG9wZW5hdChkZmQsIGRlLT5kX25hbWUsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkgfCBPX0NMT0VYRUMpOwotICAgICAgICBpZihmZCA8IDApCi0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGZkIDwgMCkgY29udGludWU7CiAKICAgICAgICAgZDIgPSBmZG9wZW5kaXIoZmQpOwotICAgICAgICBpZihkMiA9PSAwKQorICAgICAgICBpZiAoZDIgPT0gMCkKICAgICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBkb19jb2xkYm9vdChkMiwgbHZsICsgMSk7CkBAIC0yMDUsMTAgKzIwMywxMCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29sZGJvb3QoY29uc3QgY2hhciAqcGF0aCkgeworc3RhdGljIHZvaWQgY29sZGJvb3QoY29uc3QgY2hhciogcGF0aCkgewogICAgIEFUUkFDRV9OQU1FKCJjb2xkYm9vdCIpOwotICAgIERJUiAqZCA9IG9wZW5kaXIocGF0aCk7Ci0gICAgaWYoZCkgeworICAgIERJUiogZCA9IG9wZW5kaXIocGF0aCk7CisgICAgaWYgKGQpIHsKICAgICAgICAgZG9fY29sZGJvb3QoZCwgMCk7CiAgICAgICAgIGNsb3NlZGlyKGQpOwogICAgIH0KQEAgLTI1MSwxMyArMjQ5LDEzIEBACiAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtBZG9wdGFibGU7CiAgICAgICAgICAgICAgICAgKmhhc19hZG9wdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZzX21ncl9pc19ub2VtdWxhdGVkc2QocmVjKQotICAgICAgICAgICAgICAgICAgICB8fCBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInZvbGQuZGVidWcuZGVmYXVsdF9wcmltYXJ5IiwgZmFsc2UpKSB7CisgICAgICAgICAgICBpZiAoZnNfbWdyX2lzX25vZW11bGF0ZWRzZChyZWMpIHx8CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJ2b2xkLmRlYnVnLmRlZmF1bHRfcHJpbWFyeSIsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprRGVmYXVsdFByaW1hcnk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZtLT5hZGREaXNrU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVNYW5hZ2VyOjpEaXNrU291cmNlPigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFZvbHVtZU1hbmFnZXI6OkRpc2tTb3VyY2Uoc3lzUGF0dGVybiwgbmlja25hbWUsIGZsYWdzKSkpOworICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVNYW5hZ2VyOjpEaXNrU291cmNlKHN5c1BhdHRlcm4sIG5pY2tuYW1lLCBmbGFncykpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21vZGVsL0Rpc2suY3BwIGIvbW9kZWwvRGlzay5jcHAKaW5kZXggNzgxZDNlOS4uMTNjYjFjNyAxMDA2NDQKLS0tIGEvbW9kZWwvRGlzay5jcHAKKysrIGIvbW9kZWwvRGlzay5jcHAKQEAgLTE1LDM2ICsxNSwzNiBAQAogICovCiAKICNpbmNsdWRlICJEaXNrLmgiCi0jaW5jbHVkZSAiUHVibGljVm9sdW1lLmgiCisjaW5jbHVkZSAiRXh0NENyeXB0LmgiCiAjaW5jbHVkZSAiUHJpdmF0ZVZvbHVtZS5oIgorI2luY2x1ZGUgIlB1YmxpY1ZvbHVtZS5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCiAjaW5jbHVkZSAiVm9sdW1lQmFzZS5oIgogI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKLSNpbmNsdWRlICJFeHQ0Q3J5cHQuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgogI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF9jcnlwdC5oPgogCiAjaW5jbHVkZSAiY3J5cHRmcy5oIgogCi0jaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgotI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZzsKLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB2b2xkIHsKQEAgLTExMiwyMCArMTEyLDIyIEBACiAgICAgICogInJhbmNodSIsIHRoZSBkZXZpY2UncyBzeXNmcyBwYXRoIHNob3VsZCBlbmQgd2l0aCAiL2Jsb2NrL3ZkW2Qtel0iLCBldGMuCiAgICAgICogQnV0IGp1c3QgaGF2aW5nIGEpIGFuZCBiKSBpcyBlbm91Z2ggZm9yIG5vdy4KICAgICAgKi8KLSAgICByZXR1cm4gSXNSdW5uaW5nSW5FbXVsYXRvcigpICYmIG1ham9yID49IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluCi0gICAgICAgICAgICAmJiBtYWpvciA8PSBrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1heDsKKyAgICByZXR1cm4gSXNSdW5uaW5nSW5FbXVsYXRvcigpICYmIG1ham9yID49IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluICYmCisgICAgICAgICAgIG1ham9yIDw9IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4OwogfQogCiBzdGF0aWMgYm9vbCBpc052bWVCbGtEZXZpY2UodW5zaWduZWQgaW50IG1ham9yLCBjb25zdCBzdGQ6OnN0cmluZyYgc3lzUGF0aCkgewotICAgIHJldHVybiBzeXNQYXRoLmZpbmQoIm52bWUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcwotICAgICAgICAgICAgJiYgbWFqb3IgPj0ga01ham9yQmxvY2tEeW5hbWljTWluCi0gICAgICAgICAgICAmJiBtYWpvciA8PSBrTWFqb3JCbG9ja0R5bmFtaWNNYXg7CisgICAgcmV0dXJuIHN5c1BhdGguZmluZCgibnZtZSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIG1ham9yID49IGtNYWpvckJsb2NrRHluYW1pY01pbiAmJgorICAgICAgICAgICBtYWpvciA8PSBrTWFqb3JCbG9ja0R5bmFtaWNNYXg7CiB9CiAKLURpc2s6OkRpc2soY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZW50UGF0aCwgZGV2X3QgZGV2aWNlLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmlja25hbWUsIGludCBmbGFncykgOgotICAgICAgICBtRGV2aWNlKGRldmljZSksIG1TaXplKC0xKSwgbU5pY2tuYW1lKG5pY2tuYW1lKSwgbUZsYWdzKGZsYWdzKSwgbUNyZWF0ZWQoCi0gICAgICAgICAgICAgICAgZmFsc2UpLCBtSnVzdFBhcnRpdGlvbmVkKGZhbHNlKSB7CitEaXNrOjpEaXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFBhdGgsIGRldl90IGRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5pY2tuYW1lLCBpbnQgZmxhZ3MpCisgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICBtU2l6ZSgtMSksCisgICAgICBtTmlja25hbWUobmlja25hbWUpLAorICAgICAgbUZsYWdzKGZsYWdzKSwKKyAgICAgIG1DcmVhdGVkKGZhbHNlKSwKKyAgICAgIG1KdXN0UGFydGl0aW9uZWQoZmFsc2UpIHsKICAgICBtSWQgPSBTdHJpbmdQcmludGYoImRpc2s6JXUsJXUiLCBtYWpvcihkZXZpY2UpLCBtaW5vcihkZXZpY2UpKTsKICAgICBtRXZlbnRQYXRoID0gZXZlbnRQYXRoOwogICAgIG1TeXNQYXRoID0gU3RyaW5nUHJpbnRmKCIvc3lzLyVzIiwgZXZlbnRQYXRoLmNfc3RyKCkpOwpAQCAtMjUxLDczICsyNTMsNzggQEAKIAogICAgIHVuc2lnbmVkIGludCBtYWpvcklkID0gbWFqb3IobURldmljZSk7CiAgICAgc3dpdGNoIChtYWpvcklkKSB7Ci0gICAgY2FzZSBrTWFqb3JCbG9ja0xvb3A6IHsKLSAgICAgICAgbUxhYmVsID0gIlZpcnR1YWwiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lBOiBjYXNlIGtNYWpvckJsb2NrU2NzaUI6IGNhc2Uga01ham9yQmxvY2tTY3NpQzogY2FzZSBrTWFqb3JCbG9ja1Njc2lEOgotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpRTogY2FzZSBrTWFqb3JCbG9ja1Njc2lGOiBjYXNlIGtNYWpvckJsb2NrU2NzaUc6IGNhc2Uga01ham9yQmxvY2tTY3NpSDoKLSAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUk6IGNhc2Uga01ham9yQmxvY2tTY3NpSjogY2FzZSBrTWFqb3JCbG9ja1Njc2lLOiBjYXNlIGtNYWpvckJsb2NrU2NzaUw6Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lNOiBjYXNlIGtNYWpvckJsb2NrU2NzaU46IGNhc2Uga01ham9yQmxvY2tTY3NpTzogY2FzZSBrTWFqb3JCbG9ja1Njc2lQOiB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS92ZW5kb3IiKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKLSAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIHZlbmRvciBmcm9tICIgPDwgcGF0aDsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gYW5kcm9pZDo6YmFzZTo6VHJpbSh0bXApOwotICAgICAgICBtTGFiZWwgPSB0bXA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS9tYW5maWQiKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKLSAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIG1hbnVmYWN0dXJlciBmcm9tICIgPDwgcGF0aDsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gYW5kcm9pZDo6YmFzZTo6VHJpbSh0bXApOwotICAgICAgICBpbnQ2NF90IG1hbmZpZDsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludCh0bXAsICZtYW5maWQpKSB7Ci0gICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcGFyc2UgbWFudWZhY3R1cmVyICIgPDwgdG1wOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT3VyIGdvYWwgaGVyZSBpcyB0byBnaXZlIHRoZSB1c2VyIGEgbWVhbmluZ2Z1bCBsYWJlbCwgaWRlYWxseQotICAgICAgICAvLyBtYXRjaGluZyB3aGF0ZXZlciBpcyBzaWxrLXNjcmVlbmVkIG9uIHRoZSBjYXJkLiAgVG8gcmVkdWNlCi0gICAgICAgIC8vIHVzZXIgY29uZnVzaW9uLCB0aGlzIGxpc3QgZG9lc24ndCBjb250YWluIHdoaXRlLWxhYmVsIG1hbmZpZC4KLSAgICAgICAgc3dpdGNoIChtYW5maWQpIHsKLSAgICAgICAgY2FzZSAweDAwMDAwMzogbUxhYmVsID0gIlNhbkRpc2siOyBicmVhazsKLSAgICAgICAgY2FzZSAweDAwMDAxYjogbUxhYmVsID0gIlNhbXN1bmciOyBicmVhazsKLSAgICAgICAgY2FzZSAweDAwMDAyODogbUxhYmVsID0gIkxleGFyIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgwMDAwNzQ6IG1MYWJlbCA9ICJUcmFuc2NlbmQiOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgICBpZiAoaXNWaXJ0aW9CbGtEZXZpY2UobWFqb3JJZCkpIHsKLSAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlJlY29nbml6ZWQgZXhwZXJpbWVudGFsIGJsb2NrIG1ham9yIElEICIgPDwgbWFqb3JJZAotICAgICAgICAgICAgICAgICAgICA8PCAiIGFzIHZpcnRpby1ibGsgKGVtdWxhdG9yJ3MgdmlydHVhbCBTRCBjYXJkIGRldmljZSkiOworICAgICAgICBjYXNlIGtNYWpvckJsb2NrTG9vcDogewogICAgICAgICAgICAgbUxhYmVsID0gIlZpcnR1YWwiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlzTnZtZUJsa0RldmljZShtYWpvcklkLCBtU3lzUGF0aCkpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS9tb2RlbCIpOworICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpQTogY2FzZSBrTWFqb3JCbG9ja1Njc2lCOiBjYXNlIGtNYWpvckJsb2NrU2NzaUM6CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpRDogY2FzZSBrTWFqb3JCbG9ja1Njc2lFOiBjYXNlIGtNYWpvckJsb2NrU2NzaUY6CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpRzogY2FzZSBrTWFqb3JCbG9ja1Njc2lIOiBjYXNlIGtNYWpvckJsb2NrU2NzaUk6CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpSjogY2FzZSBrTWFqb3JCbG9ja1Njc2lLOiBjYXNlIGtNYWpvckJsb2NrU2NzaUw6CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpTTogY2FzZSBrTWFqb3JCbG9ja1Njc2lOOiBjYXNlIGtNYWpvckJsb2NrU2NzaU86CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpUDogeworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoKG1TeXNQYXRoICsgIi9kZXZpY2UvdmVuZG9yIik7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0bXA7CiAgICAgICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKICAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcmVhZCB2ZW5kb3IgZnJvbSAiIDw8IHBhdGg7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcCA9IGFuZHJvaWQ6OmJhc2U6OlRyaW0odG1wKTsKICAgICAgICAgICAgIG1MYWJlbCA9IHRtcDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgYmxvY2sgbWFqb3IgdHlwZSAiIDw8IG1ham9ySWQ7Ci0gICAgICAgIHJldHVybiAtRU5PVFNVUDsKLSAgICB9CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tNbWM6IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS9tYW5maWQiKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRtcDsKKyAgICAgICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhwYXRoLCAmdG1wKSkgeworICAgICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIG1hbnVmYWN0dXJlciBmcm9tICIgPDwgcGF0aDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wID0gYW5kcm9pZDo6YmFzZTo6VHJpbSh0bXApOworICAgICAgICAgICAgaW50NjRfdCBtYW5maWQ7CisgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlSW50KHRtcCwgJm1hbmZpZCkpIHsKKyAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcGFyc2UgbWFudWZhY3R1cmVyICIgPDwgdG1wOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gT3VyIGdvYWwgaGVyZSBpcyB0byBnaXZlIHRoZSB1c2VyIGEgbWVhbmluZ2Z1bCBsYWJlbCwgaWRlYWxseQorICAgICAgICAgICAgLy8gbWF0Y2hpbmcgd2hhdGV2ZXIgaXMgc2lsay1zY3JlZW5lZCBvbiB0aGUgY2FyZC4gIFRvIHJlZHVjZQorICAgICAgICAgICAgLy8gdXNlciBjb25mdXNpb24sIHRoaXMgbGlzdCBkb2Vzbid0IGNvbnRhaW4gd2hpdGUtbGFiZWwgbWFuZmlkLgorICAgICAgICAgICAgc3dpdGNoIChtYW5maWQpIHsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDAwMzogbUxhYmVsID0gIlNhbkRpc2siOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMDFiOiBtTGFiZWwgPSAiU2Ftc3VuZyI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgwMDAwMjg6IG1MYWJlbCA9ICJMZXhhciI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgwMDAwNzQ6IG1MYWJlbCA9ICJUcmFuc2NlbmQiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBpZiAoaXNWaXJ0aW9CbGtEZXZpY2UobWFqb3JJZCkpIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJSZWNvZ25pemVkIGV4cGVyaW1lbnRhbCBibG9jayBtYWpvciBJRCAiIDw8IG1ham9ySWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYXMgdmlydGlvLWJsayAoZW11bGF0b3IncyB2aXJ0dWFsIFNEIGNhcmQgZGV2aWNlKSI7CisgICAgICAgICAgICAgICAgbUxhYmVsID0gIlZpcnR1YWwiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzTnZtZUJsa0RldmljZShtYWpvcklkLCBtU3lzUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoKG1TeXNQYXRoICsgIi9kZXZpY2UvbW9kZWwiKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0bXA7CisgICAgICAgICAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKHBhdGgsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIHZlbmRvciBmcm9tICIgPDwgcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxhYmVsID0gdG1wOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBibG9jayBtYWpvciB0eXBlICIgPDwgbWFqb3JJZDsKKyAgICAgICAgICAgIHJldHVybiAtRU5PVFNVUDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGF1dG8gbGlzdGVuZXIgPSBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5nZXRMaXN0ZW5lcigpOwotICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXItPm9uRGlza01ldGFkYXRhQ2hhbmdlZChnZXRJZCgpLAotICAgICAgICAgICAgbVNpemUsIG1MYWJlbCwgbVN5c1BhdGgpOworICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXItPm9uRGlza01ldGFkYXRhQ2hhbmdlZChnZXRJZCgpLCBtU2l6ZSwgbUxhYmVsLCBtU3lzUGF0aCk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC01NjMsNDUgKzU3MCw0OSBAQAogICAgIC8vIEZpZ3VyZSBvdXQgbWF4aW11bSBwYXJ0aXRpb24gZGV2aWNlcyBzdXBwb3J0ZWQKICAgICB1bnNpZ25lZCBpbnQgbWFqb3JJZCA9IG1ham9yKG1EZXZpY2UpOwogICAgIHN3aXRjaCAobWFqb3JJZCkgewotICAgIGNhc2Uga01ham9yQmxvY2tMb29wOiB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHRtcDsKLSAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKGtTeXNmc0xvb3BNYXhNaW5vcnMsICZ0bXApKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBtYXggbWlub3JzIjsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tMb29wOiB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0bXA7CisgICAgICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcoa1N5c2ZzTG9vcE1heE1pbm9ycywgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBtYXggbWlub3JzIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RvaSh0bXApOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGQ6OnN0b2kodG1wKTsKLSAgICB9Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lBOiBjYXNlIGtNYWpvckJsb2NrU2NzaUI6IGNhc2Uga01ham9yQmxvY2tTY3NpQzogY2FzZSBrTWFqb3JCbG9ja1Njc2lEOgotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpRTogY2FzZSBrTWFqb3JCbG9ja1Njc2lGOiBjYXNlIGtNYWpvckJsb2NrU2NzaUc6IGNhc2Uga01ham9yQmxvY2tTY3NpSDoKLSAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUk6IGNhc2Uga01ham9yQmxvY2tTY3NpSjogY2FzZSBrTWFqb3JCbG9ja1Njc2lLOiBjYXNlIGtNYWpvckJsb2NrU2NzaUw6Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lNOiBjYXNlIGtNYWpvckJsb2NrU2NzaU46IGNhc2Uga01ham9yQmxvY2tTY3NpTzogY2FzZSBrTWFqb3JCbG9ja1Njc2lQOiB7Ci0gICAgICAgIC8vIFBlciBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0IHRoaXMgaXMgc3RhdGljCi0gICAgICAgIHJldHVybiAxNTsKLSAgICB9Ci0gICAgY2FzZSBrTWFqb3JCbG9ja01tYzogewotICAgICAgICAvLyBQZXIgRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dCB0aGlzIGlzIGR5bmFtaWMKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcoa1N5c2ZzTW1jTWF4TWlub3JzLCAmdG1wKSAmJgotICAgICAgICAgICAgICAgICFSZWFkRmlsZVRvU3RyaW5nKGtTeXNmc01tY01heE1pbm9yc0RlcHJlY2F0ZWQsICZ0bXApKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBtYXggbWlub3JzIjsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0ZDo6c3RvaSh0bXApOwotICAgIH0KLSAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGlmIChpc1ZpcnRpb0Jsa0RldmljZShtYWpvcklkKSkgewotICAgICAgICAgICAgLy8gZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMgaGFzICIjZGVmaW5lIFBBUlRfQklUUyA0Iiwgc28gbWF4IGlzCi0gICAgICAgICAgICAvLyAyXjQgLSAxID0gMTUKKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUE6IGNhc2Uga01ham9yQmxvY2tTY3NpQjogY2FzZSBrTWFqb3JCbG9ja1Njc2lDOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUQ6IGNhc2Uga01ham9yQmxvY2tTY3NpRTogY2FzZSBrTWFqb3JCbG9ja1Njc2lGOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUc6IGNhc2Uga01ham9yQmxvY2tTY3NpSDogY2FzZSBrTWFqb3JCbG9ja1Njc2lJOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUo6IGNhc2Uga01ham9yQmxvY2tTY3NpSzogY2FzZSBrTWFqb3JCbG9ja1Njc2lMOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaU06IGNhc2Uga01ham9yQmxvY2tTY3NpTjogY2FzZSBrTWFqb3JCbG9ja1Njc2lPOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaVA6IHsKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgICAgICAgICAgLy8gUGVyIERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgdGhpcyBpcyBzdGF0aWMKICAgICAgICAgICAgIHJldHVybiAxNTsKICAgICAgICAgfQotICAgICAgICBpZiAoaXNOdm1lQmxrRGV2aWNlKG1ham9ySWQsIG1TeXNQYXRoKSkgewotICAgICAgICAgICAgLy8gZGVzcGl0ZSBrZXJuZWwgbnZtZSBkcml2ZXIgc3VwcG9ydHMgdXAgdG8gMU0gbWlub3JzLAotICAgICAgICAgICAgLy8gICAgICNkZWZpbmUgTlZNRV9NSU5PUlMgKDFVIDw8IE1JTk9SQklUUykKLSAgICAgICAgICAgIC8vIHNnZGlzayBjYW4gbm90IHN1cHBvcnQgbW9yZSB0aGFuIDEyNyBwYXJ0aXRpb25zLCBkdWUgdG8KLSAgICAgICAgICAgIC8vICAgICAjZGVmaW5lIE1BWF9NQlJfUEFSVFMgMTI4Ci0gICAgICAgICAgICByZXR1cm4gMTI3OworICAgICAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7CisgICAgICAgICAgICAvLyBQZXIgRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dCB0aGlzIGlzIGR5bmFtaWMKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRtcDsKKyAgICAgICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNNbWNNYXhNaW5vcnMsICZ0bXApICYmCisgICAgICAgICAgICAgICAgIVJlYWRGaWxlVG9TdHJpbmcoa1N5c2ZzTW1jTWF4TWlub3JzRGVwcmVjYXRlZCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBtYXggbWlub3JzIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RvaSh0bXApOwogICAgICAgICB9Ci0gICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBpZiAoaXNWaXJ0aW9CbGtEZXZpY2UobWFqb3JJZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBkcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYyBoYXMgIiNkZWZpbmUgUEFSVF9CSVRTIDQiLCBzbyBtYXggaXMKKyAgICAgICAgICAgICAgICAvLyAyXjQgLSAxID0gMTUKKyAgICAgICAgICAgICAgICByZXR1cm4gMTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNOdm1lQmxrRGV2aWNlKG1ham9ySWQsIG1TeXNQYXRoKSkgeworICAgICAgICAgICAgICAgIC8vIGRlc3BpdGUga2VybmVsIG52bWUgZHJpdmVyIHN1cHBvcnRzIHVwIHRvIDFNIG1pbm9ycywKKyAgICAgICAgICAgICAgICAvLyAgICAgI2RlZmluZSBOVk1FX01JTk9SUyAoMVUgPDwgTUlOT1JCSVRTKQorICAgICAgICAgICAgICAgIC8vIHNnZGlzayBjYW4gbm90IHN1cHBvcnQgbW9yZSB0aGFuIDEyNyBwYXJ0aXRpb25zLCBkdWUgdG8KKyAgICAgICAgICAgICAgICAvLyAgICAgI2RlZmluZSBNQVhfTUJSX1BBUlRTIDEyOAorICAgICAgICAgICAgICAgIHJldHVybiAxMjc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBMT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCBibG9jayBtYWpvciB0eXBlICIgPDwgbWFqb3JJZDsKZGlmZiAtLWdpdCBhL21vZGVsL0Rpc2suaCBiL21vZGVsL0Rpc2suaAppbmRleCA2M2FjZjZhLi4zMTQwMTQ0IDEwMDY0NAotLS0gYS9tb2RlbC9EaXNrLmgKKysrIGIvbW9kZWwvRGlzay5oCkBAIC0zNiw3ICszNiw3IEBACiAgKiBob3cgdG8gcmVwYXJ0aXRpb24gaXRzZWxmLgogICovCiBjbGFzcyBEaXNrIHsKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIERpc2soY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZW50UGF0aCwgZGV2X3QgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgbmlja25hbWUsIGludCBmbGFncyk7CiAgICAgdmlydHVhbCB+RGlzaygpOwogCkBAIC03OSw3ICs3OSw3IEBACiAgICAgc3RhdHVzX3QgcGFydGl0aW9uUHJpdmF0ZSgpOwogICAgIHN0YXR1c190IHBhcnRpdGlvbk1peGVkKGludDhfdCByYXRpbyk7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgLyogSUQgdGhhdCB1bmlxdWVseSByZWZlcmVuY2VzIHRoaXMgZGlzayAqLwogICAgIHN0ZDo6c3RyaW5nIG1JZDsKICAgICAvKiBPcmlnaW5hbCBldmVudCBwYXRoICovCmRpZmYgLS1naXQgYS9tb2RlbC9FbXVsYXRlZFZvbHVtZS5jcHAgYi9tb2RlbC9FbXVsYXRlZFZvbHVtZS5jcHAKaW5kZXggNmUxZmZjZS4uN2VjMTA5YyAxMDA2NDQKLS0tIGEvbW9kZWwvRW11bGF0ZWRWb2x1bWUuY3BwCisrKyBiL21vZGVsL0VtdWxhdGVkVm9sdW1lLmNwcApAQCAtMjcsOCArMjcsOCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKQEAgLTM4LDIyICszOCwyMSBAQAogCiBzdGF0aWMgY29uc3QgY2hhcioga0Z1c2VQYXRoID0gIi9zeXN0ZW0vYmluL3NkY2FyZCI7CiAKLUVtdWxhdGVkVm9sdW1lOjpFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCkgOgotICAgICAgICBWb2x1bWVCYXNlKFR5cGU6OmtFbXVsYXRlZCksIG1GdXNlUGlkKDApIHsKK0VtdWxhdGVkVm9sdW1lOjpFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCkKKyAgICA6IFZvbHVtZUJhc2UoVHlwZTo6a0VtdWxhdGVkKSwgbUZ1c2VQaWQoMCkgewogICAgIHNldElkKCJlbXVsYXRlZCIpOwogICAgIG1SYXdQYXRoID0gcmF3UGF0aDsKICAgICBtTGFiZWwgPSAiZW11bGF0ZWQiOwogfQogCi1FbXVsYXRlZFZvbHVtZTo6RW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgsIGRldl90IGRldmljZSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCkgOiBWb2x1bWVCYXNlKFR5cGU6OmtFbXVsYXRlZCksIG1GdXNlUGlkKDApIHsKK0VtdWxhdGVkVm9sdW1lOjpFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCwgZGV2X3QgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkKQorICAgIDogVm9sdW1lQmFzZShUeXBlOjprRW11bGF0ZWQpLCBtRnVzZVBpZCgwKSB7CiAgICAgc2V0SWQoU3RyaW5nUHJpbnRmKCJlbXVsYXRlZDoldSwldSIsIG1ham9yKGRldmljZSksIG1pbm9yKGRldmljZSkpKTsKICAgICBtUmF3UGF0aCA9IHJhd1BhdGg7CiAgICAgbUxhYmVsID0gZnNVdWlkOwogfQogCi1FbXVsYXRlZFZvbHVtZTo6fkVtdWxhdGVkVm9sdW1lKCkgewotfQorRW11bGF0ZWRWb2x1bWU6On5FbXVsYXRlZFZvbHVtZSgpIHt9CiAKIHN0YXR1c190IEVtdWxhdGVkVm9sdW1lOjpkb01vdW50KCkgewogICAgIC8vIFdlIGNvdWxkIGhhdmUgbWlncmF0ZWQgc3RvcmFnZSB0byBhbiBhZG9wdGVkIHByaXZhdGUgdm9sdW1lLCBzbyBhbHdheXMKQEAgLTcxLDggKzcwLDggQEAKICAgICBzZXRQYXRoKFN0cmluZ1ByaW50ZigiL3N0b3JhZ2UvJXMiLCBsYWJlbC5jX3N0cigpKSk7CiAKICAgICBpZiAoZnNfcHJlcGFyZV9kaXIobUZ1c2VEZWZhdWx0LmNfc3RyKCksIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkgfHwKLSAgICAgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlUmVhZC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8Ci0gICAgICAgICAgICBmc19wcmVwYXJlX2RpcihtRnVzZVdyaXRlLmNfc3RyKCksIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkpIHsKKyAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VSZWFkLmNfc3RyKCksIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkgfHwKKyAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VXcml0ZS5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gY3JlYXRlIG1vdW50IHBvaW50cyI7CiAgICAgICAgIHJldHVybiAtZXJybm87CiAgICAgfQpAQCAtODAsNiArNzksNyBAQAogICAgIGRldl90IGJlZm9yZSA9IEdldERldmljZShtRnVzZVdyaXRlKTsKIAogICAgIGlmICghKG1GdXNlUGlkID0gZm9yaygpKSkgeworICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgICAgIGlmIChleGVjbChrRnVzZVBhdGgsIGtGdXNlUGF0aCwKICAgICAgICAgICAgICAgICAiLXUiLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwogICAgICAgICAgICAgICAgICItZyIsICIxMDIzIiwgLy8gQUlEX01FRElBX1JXCkBAIC05MCw2ICs5MCw3IEBACiAgICAgICAgICAgICAgICAgbVJhd1BhdGguY19zdHIoKSwKICAgICAgICAgICAgICAgICBsYWJlbC5jX3N0cigpLAogICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZXhlYyI7CiAgICAgICAgIH0KIApAQCAtMTA1LDcgKzEwNiw3IEBACiAgICAgbnNlY3NfdCBzdGFydCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpOwogICAgIHdoaWxlIChiZWZvcmUgPT0gR2V0RGV2aWNlKG1GdXNlV3JpdGUpKSB7CiAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiV2FpdGluZyBmb3IgRlVTRSB0byBzcGluIHVwLi4uIjsKLSAgICAgICAgdXNsZWVwKDUwMDAwKTsgLy8gNTBtcworICAgICAgICB1c2xlZXAoNTAwMDApOyAgLy8gNTBtcwogCiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9CT09UVElNRSk7CiAgICAgICAgIGlmIChuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMobm93IC0gc3RhcnQpID4gNTAwMCkgewpkaWZmIC0tZ2l0IGEvbW9kZWwvRW11bGF0ZWRWb2x1bWUuaCBiL21vZGVsL0VtdWxhdGVkVm9sdW1lLmgKaW5kZXggOWIwYzA0OS4uZjYxOGM1NSAxMDA2NDQKLS0tIGEvbW9kZWwvRW11bGF0ZWRWb2x1bWUuaAorKysgYi9tb2RlbC9FbXVsYXRlZFZvbHVtZS5oCkBAIC0zNiwxNiArMzYsMTYgQEAKICAqIHN0b3JlIGRhdGEgbG9jYWwgdG8gdGhlaXIgYXBwLgogICovCiBjbGFzcyBFbXVsYXRlZFZvbHVtZSA6IHB1YmxpYyBWb2x1bWVCYXNlIHsKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIGV4cGxpY2l0IEVtdWxhdGVkVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdQYXRoKTsKICAgICBFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCwgZGV2X3QgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkKTsKICAgICB2aXJ0dWFsIH5FbXVsYXRlZFZvbHVtZSgpOwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb01vdW50KCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZG9Vbm1vdW50KCkgb3ZlcnJpZGU7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgc3RkOjpzdHJpbmcgbVJhd1BhdGg7CiAgICAgc3RkOjpzdHJpbmcgbUxhYmVsOwogCmRpZmYgLS1naXQgYS9tb2RlbC9PYmJWb2x1bWUuY3BwIGIvbW9kZWwvT2JiVm9sdW1lLmNwcAppbmRleCA3MDljN2EzLi5lYzNkMjY3IDEwMDY0NAotLS0gYS9tb2RlbC9PYmJWb2x1bWUuY3BwCisrKyBiL21vZGVsL09iYlZvbHVtZS5jcHAKQEAgLTE0LDEyICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgImZzL1ZmYXQuaCIKKyNpbmNsdWRlICJPYmJWb2x1bWUuaCIKICNpbmNsdWRlICJEZXZtYXBwZXIuaCIKICNpbmNsdWRlICJMb29wLmgiCi0jaW5jbHVkZSAiT2JiVm9sdW1lLmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2xkVXRpbC5oIgorI2luY2x1ZGUgImZzL1ZmYXQuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgpAQCAtMzEsOCArMzEsOCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKQEAgLTQyLDE1ICs0MiwxNSBAQAogbmFtZXNwYWNlIHZvbGQgewogCiBPYmJWb2x1bWU6Ok9iYlZvbHVtZShpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LAotICAgICAgICBnaWRfdCBvd25lckdpZCkgOiBWb2x1bWVCYXNlKFR5cGU6OmtPYmIpIHsKKyAgICAgICAgICAgICAgICAgICAgIGdpZF90IG93bmVyR2lkKQorICAgIDogVm9sdW1lQmFzZShUeXBlOjprT2JiKSB7CiAgICAgc2V0SWQoU3RyaW5nUHJpbnRmKCJvYmI6JWQiLCBpZCkpOwogICAgIG1Tb3VyY2VQYXRoID0gc291cmNlUGF0aDsKICAgICBtU291cmNlS2V5ID0gc291cmNlS2V5OwogICAgIG1Pd25lckdpZCA9IG93bmVyR2lkOwogfQogCi1PYmJWb2x1bWU6On5PYmJWb2x1bWUoKSB7Ci19CitPYmJWb2x1bWU6On5PYmJWb2x1bWUoKSB7fQogCiBzdGF0dXNfdCBPYmJWb2x1bWU6OmRvQ3JlYXRlKCkgewogICAgIGlmIChMb29wOjpjcmVhdGUobVNvdXJjZVBhdGgsIG1Mb29wUGF0aCkpIHsKQEAgLTc1LDggKzc1LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGNoYXIgdG1wW1BBVEhfTUFYXTsKLSAgICAgICAgaWYgKERldm1hcHBlcjo6Y3JlYXRlKGdldElkKCkuY19zdHIoKSwgbUxvb3BQYXRoLmNfc3RyKCksIG1Tb3VyY2VLZXkuY19zdHIoKSwgbnJfc2VjLAotICAgICAgICAgICAgICAgIHRtcCwgUEFUSF9NQVgpKSB7CisgICAgICAgIGlmIChEZXZtYXBwZXI6OmNyZWF0ZShnZXRJZCgpLmNfc3RyKCksIG1Mb29wUGF0aC5jX3N0cigpLCBtU291cmNlS2V5LmNfc3RyKCksIG5yX3NlYywgdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFUSF9NQVgpKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGNyZWF0ZSBkbSI7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KQEAgLTEwOCw4ICsxMDgsMTAgQEAKICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBjcmVhdGUgbW91bnQgcG9pbnQiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChhbmRyb2lkOjp2b2xkOjp2ZmF0OjpNb3VudChtTW91bnRQYXRoLCBwYXRoLAotICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIHRydWUsIDAsIG1Pd25lckdpZCwgMDIyNywgZmFsc2UpKSB7CisgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgIGlmIChhbmRyb2lkOjp2b2xkOjp2ZmF0OjpNb3VudChtTW91bnRQYXRoLCBwYXRoLCB0cnVlLCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU93bmVyR2lkLCAwMjI3LCBmYWxzZSkpIHsKKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gbW91bnQiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbW9kZWwvT2JiVm9sdW1lLmggYi9tb2RlbC9PYmJWb2x1bWUuaAppbmRleCA1ZWMwY2RlLi44ZjdlZTk0IDEwMDY0NAotLS0gYS9tb2RlbC9PYmJWb2x1bWUuaAorKysgYi9tb2RlbC9PYmJWb2x1bWUuaApAQCAtMjgsMTggKzI4LDE3IEBACiAgKiBPQkIgY29udGFpbmVyLgogICovCiBjbGFzcyBPYmJWb2x1bWUgOiBwdWJsaWMgVm9sdW1lQmFzZSB7Ci1wdWJsaWM6Ci0gICAgT2JiVm9sdW1lKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VLZXksCi0gICAgICAgICAgICBnaWRfdCBvd25lckdpZCk7CisgIHB1YmxpYzoKKyAgICBPYmJWb2x1bWUoaW50IGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZUtleSwgZ2lkX3Qgb3duZXJHaWQpOwogICAgIHZpcnR1YWwgfk9iYlZvbHVtZSgpOwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb0NyZWF0ZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvRGVzdHJveSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvTW91bnQoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBkb1VubW91bnQoKSBvdmVycmlkZTsKIAotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICBzdGQ6OnN0cmluZyBtU291cmNlUGF0aDsKICAgICBzdGQ6OnN0cmluZyBtU291cmNlS2V5OwogICAgIGdpZF90IG1Pd25lckdpZDsKZGlmZiAtLWdpdCBhL21vZGVsL1ByaXZhdGVWb2x1bWUuY3BwIGIvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAKaW5kZXggY2YyMTU3Ny4uZGUyYTA5ZiAxMDA2NDQKLS0tIGEvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAKKysrIGIvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAKQEAgLTE0LDI3ICsxNCwyNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgImZzL0V4dDQuaCIKLSNpbmNsdWRlICJmcy9GMmZzLmgiCiAjaW5jbHVkZSAiUHJpdmF0ZVZvbHVtZS5oIgogI2luY2x1ZGUgIkVtdWxhdGVkVm9sdW1lLmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY3J5cHRmcy5oIgorI2luY2x1ZGUgImZzL0V4dDQuaCIKKyNpbmNsdWRlICJmcy9GMmZzLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogCkBAIC00MywxNCArNDMsMTMgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja01tYyA9IDE3OTsKIAotUHJpdmF0ZVZvbHVtZTo6UHJpdmF0ZVZvbHVtZShkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSYXcpIDoKLSAgICAgICAgVm9sdW1lQmFzZShUeXBlOjprUHJpdmF0ZSksIG1SYXdEZXZpY2UoZGV2aWNlKSwgbUtleVJhdyhrZXlSYXcpIHsKK1ByaXZhdGVWb2x1bWU6OlByaXZhdGVWb2x1bWUoZGV2X3QgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5UmF3KQorICAgIDogVm9sdW1lQmFzZShUeXBlOjprUHJpdmF0ZSksIG1SYXdEZXZpY2UoZGV2aWNlKSwgbUtleVJhdyhrZXlSYXcpIHsKICAgICBzZXRJZChTdHJpbmdQcmludGYoInByaXZhdGU6JXUsJXUiLCBtYWpvcihkZXZpY2UpLCBtaW5vcihkZXZpY2UpKSk7CiAgICAgbVJhd0RldlBhdGggPSBTdHJpbmdQcmludGYoIi9kZXYvYmxvY2svdm9sZC8lcyIsIGdldElkKCkuY19zdHIoKSk7CiB9CiAKLVByaXZhdGVWb2x1bWU6On5Qcml2YXRlVm9sdW1lKCkgewotfQorUHJpdmF0ZVZvbHVtZTo6flByaXZhdGVWb2x1bWUoKSB7fQogCiBzdGF0dXNfdCBQcml2YXRlVm9sdW1lOjpyZWFkTWV0YWRhdGEoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gUmVhZE1ldGFkYXRhKG1EbURldlBhdGgsICZtRnNUeXBlLCAmbUZzVXVpZCwgJm1Gc0xhYmVsKTsKQEAgLTY2LDkgKzY1LDkgQEAKICAgICAgICAgcmV0dXJuIC1FSU87CiAgICAgfQogICAgIGlmIChtS2V5UmF3LnNpemUoKSAhPSBjcnlwdGZzX2dldF9rZXlzaXplKCkpIHsKLSAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBSYXcga2V5c2l6ZSAiIDw8IG1LZXlSYXcuc2l6ZSgpIDw8Ci0gICAgICAgICAgIiBkb2VzIG5vdCBtYXRjaCBjcnlwdCBrZXlzaXplICIgPDwgY3J5cHRmc19nZXRfa2V5c2l6ZSgpOwotICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBSYXcga2V5c2l6ZSAiIDw8IG1LZXlSYXcuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgZG9lcyBub3QgbWF0Y2ggY3J5cHQga2V5c2l6ZSAiIDw8IGNyeXB0ZnNfZ2V0X2tleXNpemUoKTsKKyAgICAgICAgcmV0dXJuIC1FSU87CiAgICAgfQogCiAgICAgLy8gUmVjb3ZlciBmcm9tIHN0YWxlIHZvbGQgYnkgdGVhcmluZyBkb3duIGFueSBvbGQgbWFwcGluZ3MKQEAgLTc2LDEwICs3NSw5IEBACiAKICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGJldHRlciBTRUxpbnV4IGxhYmVscyBmb3IgcHJpdmF0ZSB2b2x1bWVzCiAKLSAgICB1bnNpZ25lZCBjaGFyKiBrZXkgPSAodW5zaWduZWQgY2hhciopIG1LZXlSYXcuZGF0YSgpOworICAgIHVuc2lnbmVkIGNoYXIqIGtleSA9ICh1bnNpZ25lZCBjaGFyKiltS2V5UmF3LmRhdGEoKTsKICAgICBjaGFyIGNyeXB0b19ibGtkZXZbTUFYUEFUSExFTl07Ci0gICAgaW50IHJlcyA9IGNyeXB0ZnNfc2V0dXBfZXh0X3ZvbHVtZShnZXRJZCgpLmNfc3RyKCksIG1SYXdEZXZQYXRoLmNfc3RyKCksCi0gICAgICAgICAgICBrZXksIGNyeXB0b19ibGtkZXYpOworICAgIGludCByZXMgPSBjcnlwdGZzX3NldHVwX2V4dF92b2x1bWUoZ2V0SWQoKS5jX3N0cigpLCBtUmF3RGV2UGF0aC5jX3N0cigpLCBrZXksIGNyeXB0b19ibGtkZXYpOwogICAgIG1EbURldlBhdGggPSBjcnlwdG9fYmxrZGV2OwogICAgIGlmIChyZXMgIT0gMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIHNldHVwIGNyeXB0ZnMiOwpAQCAtMTQ3LDEyICsxNDUsMTIgQEAKIAogICAgIC8vIFZlcmlmeSB0aGF0IGNvbW1vbiBkaXJlY3RvcmllcyBhcmUgcmVhZHkgdG8gcm9sbAogICAgIGlmIChQcmVwYXJlRGlyKG1QYXRoICsgIi9hcHAiLCAwNzcxLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSB8fAotICAgICAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvdXNlciIsIDA3MTEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi91c2VyX2RlIiwgMDcxMSwgQUlEX1NZU1RFTSwgQUlEX1NZU1RFTSkgfHwKLSAgICAgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhIiwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi9tZWRpYS8wIiwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi9sb2NhbCIsIDA3NTEsIEFJRF9ST09ULCBBSURfUk9PVCkgfHwKLSAgICAgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL2xvY2FsL3RtcCIsIDA3NzEsIEFJRF9TSEVMTCwgQUlEX1NIRUxMKSkgeworICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi91c2VyIiwgMDcxMSwgQUlEX1NZU1RFTSwgQUlEX1NZU1RFTSkgfHwKKyAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvdXNlcl9kZSIsIDA3MTEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pIHx8CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhIiwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpIHx8CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhLzAiLCAwNzcwLCBBSURfTUVESUFfUlcsIEFJRF9NRURJQV9SVykgfHwKKyAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvbG9jYWwiLCAwNzUxLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL2xvY2FsL3RtcCIsIDA3NzEsIEFJRF9TSEVMTCwgQUlEX1NIRUxMKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIHByZXBhcmUiOwogICAgICAgICByZXR1cm4gLUVJTzsKICAgICB9CkBAIC0xNjAsOCArMTU4LDcgQEAKICAgICAvLyBDcmVhdGUgYSBuZXcgZW11bGF0ZWQgdm9sdW1lIHN0YWNrZWQgYWJvdmUgdXMsIGl0IHdpbGwgYXV0b21hdGljYWxseQogICAgIC8vIGJlIGRlc3Ryb3llZCBkdXJpbmcgdW5tb3VudAogICAgIHN0ZDo6c3RyaW5nIG1lZGlhUGF0aChtUGF0aCArICIvbWVkaWEiKTsKLSAgICBhdXRvIHZvbCA9IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPigKLSAgICAgICAgICAgIG5ldyBFbXVsYXRlZFZvbHVtZShtZWRpYVBhdGgsIG1SYXdEZXZpY2UsIG1Gc1V1aWQpKTsKKyAgICBhdXRvIHZvbCA9IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPihuZXcgRW11bGF0ZWRWb2x1bWUobWVkaWFQYXRoLCBtUmF3RGV2aWNlLCBtRnNVdWlkKSk7CiAgICAgYWRkVm9sdW1lKHZvbCk7CiAgICAgdm9sLT5jcmVhdGUoKTsKIApkaWZmIC0tZ2l0IGEvbW9kZWwvUHJpdmF0ZVZvbHVtZS5oIGIvbW9kZWwvUHJpdmF0ZVZvbHVtZS5oCmluZGV4IDlhNjFmOGQuLjg1YWE0ZGMgMTAwNjQ0Ci0tLSBhL21vZGVsL1ByaXZhdGVWb2x1bWUuaAorKysgYi9tb2RlbC9Qcml2YXRlVm9sdW1lLmgKQEAgLTM2LDE0ICszNiwxNCBAQAogICoga2V5cyBhcmUgdGlnaHRseSB0aWVkIHRvIHRoaXMgZGV2aWNlLgogICovCiBjbGFzcyBQcml2YXRlVm9sdW1lIDogcHVibGljIFZvbHVtZUJhc2UgewotcHVibGljOgorICBwdWJsaWM6CiAgICAgUHJpdmF0ZVZvbHVtZShkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSYXcpOwogICAgIHZpcnR1YWwgflByaXZhdGVWb2x1bWUoKTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RnNUeXBlKCkgeyByZXR1cm4gbUZzVHlwZTsgfTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0UmF3RGV2UGF0aCgpIHsgcmV0dXJuIG1SYXdEZXZQYXRoOyB9OwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRSYXdEbURldlBhdGgoKSB7IHJldHVybiBtRG1EZXZQYXRoOyB9OwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb0NyZWF0ZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvRGVzdHJveSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvTW91bnQoKSBvdmVycmlkZTsKQEAgLTUyLDcgKzUyLDcgQEAKIAogICAgIHN0YXR1c190IHJlYWRNZXRhZGF0YSgpOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIC8qIEtlcm5lbCBkZXZpY2Ugb2YgcmF3LCBlbmNyeXB0ZWQgcGFydGl0aW9uICovCiAgICAgZGV2X3QgbVJhd0RldmljZTsKICAgICAvKiBQYXRoIHRvIHJhdywgZW5jcnlwdGVkIGJsb2NrIGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvbW9kZWwvUHVibGljVm9sdW1lLmNwcCBiL21vZGVsL1B1YmxpY1ZvbHVtZS5jcHAKaW5kZXggOWYyZWQ4NS4uNzQyMGM3OSAxMDA2NDQKLS0tIGEvbW9kZWwvUHVibGljVm9sdW1lLmNwcAorKysgYi9tb2RlbC9QdWJsaWNWb2x1bWUuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSAiZnMvRXhmYXQuaCIKICNpbmNsdWRlICJmcy9WZmF0LmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CkBAIC0zMCw4ICszMCw4IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwpAQCAtNDMsMTQgKzQzLDEyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyKiBrQXNlY1BhdGggPSAiL21udC9zZWN1cmUvYXNlYyI7CiAKLVB1YmxpY1ZvbHVtZTo6UHVibGljVm9sdW1lKGRldl90IGRldmljZSkgOgotICAgICAgICBWb2x1bWVCYXNlKFR5cGU6OmtQdWJsaWMpLCBtRGV2aWNlKGRldmljZSksIG1GdXNlUGlkKDApIHsKK1B1YmxpY1ZvbHVtZTo6UHVibGljVm9sdW1lKGRldl90IGRldmljZSkgOiBWb2x1bWVCYXNlKFR5cGU6OmtQdWJsaWMpLCBtRGV2aWNlKGRldmljZSksIG1GdXNlUGlkKDApIHsKICAgICBzZXRJZChTdHJpbmdQcmludGYoInB1YmxpYzoldSwldSIsIG1ham9yKGRldmljZSksIG1pbm9yKGRldmljZSkpKTsKICAgICBtRGV2UGF0aCA9IFN0cmluZ1ByaW50ZigiL2Rldi9ibG9jay92b2xkLyVzIiwgZ2V0SWQoKS5jX3N0cigpKTsKIH0KIAotUHVibGljVm9sdW1lOjp+UHVibGljVm9sdW1lKCkgewotfQorUHVibGljVm9sdW1lOjp+UHVibGljVm9sdW1lKCkge30KIAogc3RhdHVzX3QgUHVibGljVm9sdW1lOjpyZWFkTWV0YWRhdGEoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gUmVhZE1ldGFkYXRhVW50cnVzdGVkKG1EZXZQYXRoLCAmbUZzVHlwZSwgJm1Gc1V1aWQsICZtRnNMYWJlbCk7CkBAIC02Niw4ICs2NCw3IEBACiAgICAgc3RkOjpzdHJpbmcgc2VjdXJlUGF0aChtUmF3UGF0aCArICIvLmFuZHJvaWRfc2VjdXJlIik7CiAKICAgICAvLyBSZWNvdmVyIGxlZ2FjeSBzZWN1cmUgcGF0aAotICAgIGlmICghYWNjZXNzKGxlZ2FjeVBhdGguY19zdHIoKSwgUl9PSyB8IFhfT0spCi0gICAgICAgICAgICAmJiBhY2Nlc3Moc2VjdXJlUGF0aC5jX3N0cigpLCBSX09LIHwgWF9PSykpIHsKKyAgICBpZiAoIWFjY2VzcyhsZWdhY3lQYXRoLmNfc3RyKCksIFJfT0sgfCBYX09LKSAmJiBhY2Nlc3Moc2VjdXJlUGF0aC5jX3N0cigpLCBSX09LIHwgWF9PSykpIHsKICAgICAgICAgaWYgKHJlbmFtZShsZWdhY3lQYXRoLmNfc3RyKCksIHNlY3VyZVBhdGguY19zdHIoKSkpIHsKICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byByZW5hbWUgbGVnYWN5IEFTRUMgZGlyIjsKICAgICAgICAgfQpAQCAtMTU4LDggKzE1NSw4IEBACiAgICAgfQogCiAgICAgaWYgKGZzX3ByZXBhcmVfZGlyKG1GdXNlRGVmYXVsdC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8Ci0gICAgICAgICAgICBmc19wcmVwYXJlX2RpcihtRnVzZVJlYWQuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSB8fAotICAgICAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VXcml0ZS5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpKSB7CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlUmVhZC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlV3JpdGUuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGNyZWF0ZSBGVVNFIG1vdW50IHBvaW50cyI7CiAgICAgICAgIHJldHVybiAtZXJybm87CiAgICAgfQpAQCAtMTY4LDYgKzE2NSw3IEBACiAKICAgICBpZiAoIShtRnVzZVBpZCA9IGZvcmsoKSkpIHsKICAgICAgICAgaWYgKGdldE1vdW50RmxhZ3MoKSAmIE1vdW50RmxhZ3M6OmtQcmltYXJ5KSB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgICAgICAgICBpZiAoZXhlY2woa0Z1c2VQYXRoLCBrRnVzZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgICItdSIsICIxMDIzIiwgLy8gQUlEX01FRElBX1JXCiAgICAgICAgICAgICAgICAgICAgICItZyIsICIxMDIzIiwgLy8gQUlEX01FRElBX1JXCkBAIC0xNzYsOSArMTc0LDExIEBACiAgICAgICAgICAgICAgICAgICAgIG1SYXdQYXRoLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIHN0YWJsZU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV4ZWMiOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgICAgICAgICAgaWYgKGV4ZWNsKGtGdXNlUGF0aCwga0Z1c2VQYXRoLAogICAgICAgICAgICAgICAgICAgICAiLXUiLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwogICAgICAgICAgICAgICAgICAgICAiLWciLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwpAQCAtMTg2LDYgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1SYXdQYXRoLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIHN0YWJsZU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV4ZWMiOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMDIsNyArMjAzLDcgQEAKICAgICBuc2Vjc190IHN0YXJ0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9CT09UVElNRSk7CiAgICAgd2hpbGUgKGJlZm9yZSA9PSBHZXREZXZpY2UobUZ1c2VXcml0ZSkpIHsKICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJXYWl0aW5nIGZvciBGVVNFIHRvIHNwaW4gdXAuLi4iOwotICAgICAgICB1c2xlZXAoNTAwMDApOyAvLyA1MG1zCisgICAgICAgIHVzbGVlcCg1MDAwMCk7ICAvLyA1MG1zCiAKICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKICAgICAgICAgaWYgKG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhub3cgLSBzdGFydCkgPiA1MDAwKSB7CmRpZmYgLS1naXQgYS9tb2RlbC9QdWJsaWNWb2x1bWUuaCBiL21vZGVsL1B1YmxpY1ZvbHVtZS5oCmluZGV4IDNhYTdhNzMuLmM5MThmNTIgMTAwNjQ0Ci0tLSBhL21vZGVsL1B1YmxpY1ZvbHVtZS5oCisrKyBiL21vZGVsL1B1YmxpY1ZvbHVtZS5oCkBAIC0zOCwxMSArMzgsMTEgQEAKICAqIGF3YXkgdGhlIEFuZHJvaWQgZGlyZWN0b3J5IGZvciBzZWNvbmRhcnkgdXNlcnMuCiAgKi8KIGNsYXNzIFB1YmxpY1ZvbHVtZSA6IHB1YmxpYyBWb2x1bWVCYXNlIHsKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIGV4cGxpY2l0IFB1YmxpY1ZvbHVtZShkZXZfdCBkZXZpY2UpOwogICAgIHZpcnR1YWwgflB1YmxpY1ZvbHVtZSgpOwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb0NyZWF0ZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvRGVzdHJveSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvTW91bnQoKSBvdmVycmlkZTsKQEAgLTUyLDcgKzUyLDcgQEAKICAgICBzdGF0dXNfdCByZWFkTWV0YWRhdGEoKTsKICAgICBzdGF0dXNfdCBpbml0QXNlY1N0YWdlKCk7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgLyogS2VybmVsIGRldmljZSByZXByZXNlbnRpbmcgcGFydGl0aW9uICovCiAgICAgZGV2X3QgbURldmljZTsKICAgICAvKiBCbG9jayBkZXZpY2UgcGF0aCAqLwpkaWZmIC0tZ2l0IGEvbW9kZWwvVm9sdW1lQmFzZS5jcHAgYi9tb2RlbC9Wb2x1bWVCYXNlLmNwcAppbmRleCA0MjlmMTM0Li4zMDBhZGQxIDEwMDY0NAotLS0gYS9tb2RlbC9Wb2x1bWVCYXNlLmNwcAorKysgYi9tb2RlbC9Wb2x1bWVCYXNlLmNwcApAQCAtMTQsMTIgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2x1bWVCYXNlLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzIsMTAgKzMyLDEzIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CiAKLVZvbHVtZUJhc2U6OlZvbHVtZUJhc2UoVHlwZSB0eXBlKSA6Ci0gICAgICAgIG1UeXBlKHR5cGUpLCBtTW91bnRGbGFncygwKSwgbU1vdW50VXNlcklkKC0xKSwgbUNyZWF0ZWQoZmFsc2UpLCBtU3RhdGUoCi0gICAgICAgICAgICAgICAgU3RhdGU6OmtVbm1vdW50ZWQpLCBtU2lsZW50KGZhbHNlKSB7Ci19CitWb2x1bWVCYXNlOjpWb2x1bWVCYXNlKFR5cGUgdHlwZSkKKyAgICA6IG1UeXBlKHR5cGUpLAorICAgICAgbU1vdW50RmxhZ3MoMCksCisgICAgICBtTW91bnRVc2VySWQoLTEpLAorICAgICAgbUNyZWF0ZWQoZmFsc2UpLAorICAgICAgbVN0YXRlKFN0YXRlOjprVW5tb3VudGVkKSwKKyAgICAgIG1TaWxlbnQoZmFsc2UpIHt9CiAKIFZvbHVtZUJhc2U6On5Wb2x1bWVCYXNlKCkgewogICAgIENIRUNLKCFtQ3JlYXRlZCk7CkBAIC00NSw3ICs0OCw5IEBACiAgICAgbVN0YXRlID0gc3RhdGU7CiAKICAgICBhdXRvIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vblZvbHVtZVN0YXRlQ2hhbmdlZChnZXRJZCgpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihtU3RhdGUpKTsKKyAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uVm9sdW1lU3RhdGVDaGFuZ2VkKGdldElkKCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdGF0ZSkpOworICAgIH0KIH0KIAogc3RhdHVzX3QgVm9sdW1lQmFzZTo6c2V0RGlza0lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXNrSWQpIHsKQEAgLTEzMSw3ICsxMzYsOSBAQAogICAgIG1JbnRlcm5hbFBhdGggPSBpbnRlcm5hbFBhdGg7CiAKICAgICBhdXRvIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vblZvbHVtZUludGVybmFsUGF0aENoYW5nZWQoZ2V0SWQoKSwgbUludGVybmFsUGF0aCk7CisgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgIGxpc3RlbmVyLT5vblZvbHVtZUludGVybmFsUGF0aENoYW5nZWQoZ2V0SWQoKSwgbUludGVybmFsUGF0aCk7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTY4LDggKzE3NSw5IEBACiAgICAgc3RhdHVzX3QgcmVzID0gZG9DcmVhdGUoKTsKIAogICAgIGF1dG8gbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXItPm9uVm9sdW1lQ3JlYXRlZChnZXRJZCgpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obVR5cGUpLCBtRGlza0lkLCBtUGFydEd1aWQpOworICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICBsaXN0ZW5lci0+b25Wb2x1bWVDcmVhdGVkKGdldElkKCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1UeXBlKSwgbURpc2tJZCwgbVBhcnRHdWlkKTsKKyAgICB9CiAKICAgICBzZXRTdGF0ZShTdGF0ZTo6a1VubW91bnRlZCk7CiAgICAgcmV0dXJuIHJlczsKQEAgLTE4OSw5ICsxOTcsMTAgQEAKICAgICAgICAgc2V0U3RhdGUoU3RhdGU6OmtSZW1vdmVkKTsKICAgICB9CiAKLQogICAgIGF1dG8gbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXItPm9uVm9sdW1lRGVzdHJveWVkKGdldElkKCkpOworICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICBsaXN0ZW5lci0+b25Wb2x1bWVEZXN0cm95ZWQoZ2V0SWQoKSk7CisgICAgfQogCiAgICAgc3RhdHVzX3QgcmVzID0gZG9EZXN0cm95KCk7CiAgICAgbUNyZWF0ZWQgPSBmYWxzZTsKQEAgLTIyOCw4ICsyMzcsNyBAQAogICAgIHNldFN0YXRlKFN0YXRlOjprRWplY3RpbmcpOwogICAgIGZvciAoY29uc3QgYXV0byYgdm9sIDogbVZvbHVtZXMpIHsKICAgICAgICAgaWYgKHZvbC0+ZGVzdHJveSgpKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBkZXN0cm95ICIgPDwgdm9sLT5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgc3RhY2tlZCBhYm92ZSI7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBkZXN0cm95ICIgPDwgdm9sLT5nZXRJZCgpIDw8ICIgc3RhY2tlZCBhYm92ZSI7CiAgICAgICAgIH0KICAgICB9CiAgICAgbVZvbHVtZXMuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL21vZGVsL1ZvbHVtZUJhc2UuaCBiL21vZGVsL1ZvbHVtZUJhc2UuaAppbmRleCA0YWE4YjAyLi42NTMyYTgwIDEwMDY0NAotLS0gYS9tb2RlbC9Wb2x1bWVCYXNlLmgKKysrIGIvbW9kZWwvVm9sdW1lQmFzZS5oCkBAIC0xNyw4ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfVk9MRF9WT0xVTUVfQkFTRV9ICiAjZGVmaW5lIEFORFJPSURfVk9MRF9WT0xVTUVfQkFTRV9ICiAKLSNpbmNsdWRlICJhbmRyb2lkL29zL0lWb2xkTGlzdGVuZXIuaCIKICNpbmNsdWRlICJVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3MvSVZvbGRMaXN0ZW5lci5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNDUsNyArNDUsNyBAQAogICogdm9sdW1lcyBhbmQgcmVtb3ZlcyBhbnkgYmluZCBtb3VudHMgYmVmb3JlIGZpbmFsbHkgdW5tb3VudGluZyBpdHNlbGYuCiAgKi8KIGNsYXNzIFZvbHVtZUJhc2UgewotcHVibGljOgorICBwdWJsaWM6CiAgICAgdmlydHVhbCB+Vm9sdW1lQmFzZSgpOwogCiAgICAgZW51bSBjbGFzcyBUeXBlIHsKQEAgLTEwMiw3ICsxMDIsNyBAQAogICAgIHN0YXR1c190IHVubW91bnQoKTsKICAgICBzdGF0dXNfdCBmb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSk7CiAKLXByb3RlY3RlZDoKKyAgcHJvdGVjdGVkOgogICAgIGV4cGxpY2l0IFZvbHVtZUJhc2UoVHlwZSB0eXBlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZG9DcmVhdGUoKTsKQEAgLTExNyw3ICsxMTcsNyBAQAogCiAgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkTGlzdGVuZXI+IGdldExpc3RlbmVyKCk7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgLyogSUQgdGhhdCB1bmlxdWVseSByZWZlcmVuY2VzIHZvbHVtZSB3aGlsZSBhbGl2ZSAqLwogICAgIHN0ZDo6c3RyaW5nIG1JZDsKICAgICAvKiBJRCB0aGF0IHVuaXF1ZWx5IHJlZmVyZW5jZXMgcGFyZW50IGRpc2sgd2hpbGUgYWxpdmUgKi8KZGlmZiAtLWdpdCBhL3NlY2Rpc2NhcmQuY3BwIGIvc2VjZGlzY2FyZC5jcHAKaW5kZXggMjVhMDgyNi4uMmQ5ZGMzNSAxMDA2NDQKLS0tIGEvc2VjZGlzY2FyZC5jcHAKKysrIGIvc2VjZGlzY2FyZC5jcHAKQEAgLTE4LDE1ICsxOCwxNSBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZmllbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxtbnRlbnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmllbWFwLmg+Ci0jaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KQEAgLTQyLDIzICs0MiwyMyBAQAogCiBjb25zdGV4cHIgdWludDMyX3QgbWF4X2V4dGVudHMgPSAzMjsKIAotYm9vbCByZWFkX2NvbW1hbmRfbGluZShpbnQgYXJnYywgY29uc3QgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgT3B0aW9ucyAmb3B0aW9ucyk7Ci12b2lkIHVzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKTsKLWJvb2wgc2VjZGlzY2FyZF9wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKTsKLWJvb2wgY2hlY2tfZmllbWFwKGNvbnN0IHN0cnVjdCBmaWVtYXAgJmZpZW1hcCwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpOworYm9vbCByZWFkX2NvbW1hbmRfbGluZShpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdLCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgdXNhZ2UoY29uc3QgY2hhciogcHJvZ25hbWUpOworYm9vbCBzZWNkaXNjYXJkX3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworYm9vbCBjaGVja19maWVtYXAoY29uc3Qgc3RydWN0IGZpZW1hcCYgZmllbWFwLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiBib29sIG92ZXJ3cml0ZV93aXRoX3plcm9zKGludCBmZCwgb2ZmNjRfdCBzdGFydCwgb2ZmNjRfdCBsZW5ndGgpOwogCi19Cit9ICAvLyBuYW1lc3BhY2UKIAotaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBjb25zdCBhcmd2W10pIHsKLSAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhjb25zdF9jYXN0PGNoYXIgKio+KGFyZ3YpKTsKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhjb25zdF9jYXN0PGNoYXIqKj4oYXJndikpOwogICAgIE9wdGlvbnMgb3B0aW9uczsKICAgICBpZiAoIXJlYWRfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIG9wdGlvbnMpKSB7CiAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgZm9yIChhdXRvIGNvbnN0ICZ0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0cykgeworICAgIGZvciAoYXV0byBjb25zdCYgdGFyZ2V0IDogb3B0aW9ucy50YXJnZXRzKSB7CiAvLyBGMkZTLXNwZWNpZmljIGlvY3RsCiAvLyBJdCByZXF1aXJlcyB0aGUgYmVsb3cga2VybmVsIGNvbW1pdCBtZXJnZWQgaW4gdjQuMTYtcmMxLgogLy8gICAxYWQ3MWEyNzEyNGMgKCJmMmZzOiBhZGQgYW4gaW9jdGwgdG8gZGlzYWJsZSBHQyBmb3Igc3BlY2lmaWMgZmlsZSIpCkBAIC03MCwxMyArNzAsMTIgQEAKIC8vICAgY2U3NjdkOWE1NWJjICgiZjJmczogdXBkYXRlcyBvbiB2NC4xNi1yYzEiKQogI2lmbmRlZiBGMkZTX0lPQ19TRVRfUElOX0ZJTEUKICNpZm5kZWYgRjJGU19JT0NUTF9NQUdJQwotI2RlZmluZSBGMkZTX0lPQ1RMX01BR0lDCQkweGY1CisjZGVmaW5lIEYyRlNfSU9DVExfTUFHSUMgMHhmNQogI2VuZGlmCi0jZGVmaW5lIEYyRlNfSU9DX1NFVF9QSU5fRklMRQlfSU9XKEYyRlNfSU9DVExfTUFHSUMsIDEzLCBfX3UzMikKLSNkZWZpbmUgRjJGU19JT0NfR0VUX1BJTl9GSUxFCV9JT1IoRjJGU19JT0NUTF9NQUdJQywgMTQsIF9fdTMyKQorI2RlZmluZSBGMkZTX0lPQ19TRVRfUElOX0ZJTEUgX0lPVyhGMkZTX0lPQ1RMX01BR0lDLCAxMywgX191MzIpCisjZGVmaW5lIEYyRlNfSU9DX0dFVF9QSU5fRklMRSBfSU9SKEYyRlNfSU9DVExfTUFHSUMsIDE0LCBfX3UzMikKICNlbmRpZgotICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oCi0gICAgICAgICAgICB0YXJnZXQuY19zdHIoKSwgT19XUk9OTFksIDApKSk7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3Blbih0YXJnZXQuY19zdHIoKSwgT19XUk9OTFksIDApKSk7CiAgICAgICAgIGlmIChmZCA9PSAtMSkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2VjdXJlIGRpc2NhcmQgb3BlbiBmYWlsZWQgZm9yOiAiIDw8IHRhcmdldDsKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMTAyLDI5ICsxMDEsMjkgQEAKIAogbmFtZXNwYWNlIHsKIAotYm9vbCByZWFkX2NvbW1hbmRfbGluZShpbnQgYXJnYywgY29uc3QgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgT3B0aW9ucyAmb3B0aW9ucykgeworYm9vbCByZWFkX2NvbW1hbmRfbGluZShpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdLCBPcHRpb25zJiBvcHRpb25zKSB7CiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgaWYgKCFzdHJjbXAoIi0tbm8tdW5saW5rIiwgYXJndltpXSkpIHsKICAgICAgICAgICAgIG9wdGlvbnMudW5saW5rID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS0iLCBhcmd2W2ldKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkrMTsgaiA8IGFyZ2M7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChhcmd2W2pdWzBdICE9ICcvJykgcmV0dXJuIGZhbHNlOyAvLyBNdXN0IGJlIGFic29sdXRlIHBhdGgKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGFyZ2M7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChhcmd2W2pdWzBdICE9ICcvJykgcmV0dXJuIGZhbHNlOyAgLy8gTXVzdCBiZSBhYnNvbHV0ZSBwYXRoCiAgICAgICAgICAgICAgICAgb3B0aW9ucy50YXJnZXRzLmVtcGxhY2VfYmFjayhhcmd2W2pdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnRhcmdldHMuc2l6ZSgpID4gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gVW5rbm93biBvcHRpb24KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFVua25vd24gb3B0aW9uCiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOyAvLyAiLS0iIG5vdCBmb3VuZAorICAgIHJldHVybiBmYWxzZTsgIC8vICItLSIgbm90IGZvdW5kCiB9CiAKLXZvaWQgdXNhZ2UoY29uc3QgY2hhciAqcHJvZ25hbWUpIHsKK3ZvaWQgdXNhZ2UoY29uc3QgY2hhciogcHJvZ25hbWUpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLS1uby11bmxpbmtdIC0tIDxhYnNvbHV0ZSBwYXRoPiAuLi5cbiIsIHByb2duYW1lKTsKIH0KIAogLy8gQkxLU0VDRElTQ0FSRCBhbGwgY29udGVudCBpbiAicGF0aCIsIGlmIGl0J3Mgc21hbGwgZW5vdWdoLgotYm9vbCBzZWNkaXNjYXJkX3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpIHsKK2Jvb2wgc2VjZGlzY2FyZF9wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CiAgICAgYXV0byBmaWVtYXAgPSBhbmRyb2lkOjp2b2xkOjpQYXRoRmllbWFwKHBhdGgsIG1heF9leHRlbnRzKTsKICAgICBpZiAoIWZpZW1hcCB8fCAhY2hlY2tfZmllbWFwKCpmaWVtYXAsIHBhdGgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEzMyw4ICsxMzIsOCBAQAogICAgIGlmIChibG9ja19kZXZpY2UuZW1wdHkoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmc19mZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbigKLSAgICAgICAgYmxvY2tfZGV2aWNlLmNfc3RyKCksIE9fUkRXUiB8IE9fTEFSR0VGSUxFIHwgT19DTE9FWEVDLCAwKSkpOworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmc19mZCgKKyAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oYmxvY2tfZGV2aWNlLmNfc3RyKCksIE9fUkRXUiB8IE9fTEFSR0VGSUxFIHwgT19DTE9FWEVDLCAwKSkpOwogICAgIGlmIChmc19mZCA9PSAtMSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gZGV2aWNlICIgPDwgYmxvY2tfZGV2aWNlOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNTMsMTAgKzE1MiwxMCBAQAogfQogCiAvLyBFbnN1cmUgdGhhdCB0aGUgRklFTUFQIGNvdmVycyB0aGUgZmlsZSBhbmQgaXMgT0sgdG8gZGlzY2FyZAotYm9vbCBjaGVja19maWVtYXAoY29uc3Qgc3RydWN0IGZpZW1hcCAmZmllbWFwLCBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCkgeworYm9vbCBjaGVja19maWVtYXAoY29uc3Qgc3RydWN0IGZpZW1hcCYgZmllbWFwLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewogICAgIGF1dG8gbWFwcGVkID0gZmllbWFwLmZtX21hcHBlZF9leHRlbnRzOwogICAgIGlmICghKGZpZW1hcC5mbV9leHRlbnRzW21hcHBlZCAtIDFdLmZlX2ZsYWdzICYgRklFTUFQX0VYVEVOVF9MQVNUKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJFeHRlbnQgIiA8PCBtYXBwZWQgLTEgPDwgIiB3YXMgbm90IHRoZSBsYXN0IGluICIgPDwgcGF0aDsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXh0ZW50ICIgPDwgbWFwcGVkIC0gMSA8PCAiIHdhcyBub3QgdGhlIGxhc3QgaW4gIiA8PCBwYXRoOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYXBwZWQ7IGkrKykgewpAQCAtMTg4LDQgKzE4Nyw0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLX0KK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc2Vjb250ZXh0LmNwcCBiL3NlY29udGV4dC5jcHAKaW5kZXggMDUyOWEzMC4uYmMyMWZjMiAxMDA2NDQKLS0tIGEvc2Vjb250ZXh0LmNwcAorKysgYi9zZWNvbnRleHQuY3BwCkBAIC0xMywxMCArMTMsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLSNpbmNsdWRlIDxVdGlscy5oPgogI2luY2x1ZGUgInNlY29udGV4dC5oIgorI2luY2x1ZGUgPFV0aWxzLmg+CiAKLXNlY3VyaXR5X2NvbnRleHRfdCBzZWNvbnRleHRGc2NrKCkKLXsKK3NlY3VyaXR5X2NvbnRleHRfdCBzZWNvbnRleHRGc2NrKCkgewogICAgIHJldHVybiBhbmRyb2lkOjp2b2xkOjpzRnNja0NvbnRleHQ7CiB9CmRpZmYgLS1naXQgYS9zZWhhbmRsZS5oIGIvc2VoYW5kbGUuaAppbmRleCBmNTlkN2ViLi44OTIxZGI1IDEwMDY0NAotLS0gYS9zZWhhbmRsZS5oCisrKyBiL3NlaGFuZGxlLmgKQEAgLTE5LDYgKzE5LDYgQEAKIAogI2luY2x1ZGUgPHNlbGludXgvYW5kcm9pZC5oPgogCi1leHRlcm4gc3RydWN0IHNlbGFiZWxfaGFuZGxlICpzZWhhbmRsZTsKK2V4dGVybiBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUqIHNlaGFuZGxlOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL0NyeXB0ZnNTY3J5cHRIaWRsaXphdGlvbkVxdWl2YWxlbmNlX3Rlc3QuY3BwIGIvdGVzdHMvQ3J5cHRmc1NjcnlwdEhpZGxpemF0aW9uRXF1aXZhbGVuY2VfdGVzdC5jcHAKaW5kZXggMjkwNWFmMi4uNzIxNzBlMyAxMDA2NDQKLS0tIGEvdGVzdHMvQ3J5cHRmc1NjcnlwdEhpZGxpemF0aW9uRXF1aXZhbGVuY2VfdGVzdC5jcHAKKysrIGIvdGVzdHMvQ3J5cHRmc1NjcnlwdEhpZGxpemF0aW9uRXF1aXZhbGVuY2VfdGVzdC5jcHAKQEAgLTE4LDEzICsxOCwxMyBAQAogI2RlZmluZSBMT0dfVEFHICJzY3J5cHRfdGVzdCIKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2tleW1hc3RlcjAuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9rZXltYXN0ZXIxLmg+CiAjaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCi0jaW5jbHVkZSAiLi4vY3J5cHRmcy5oIgogI2luY2x1ZGUgIi4uL0tleW1hc3Rlci5oIgorI2luY2x1ZGUgIi4uL2NyeXB0ZnMuaCIKIAogI2lmZGVmIENPTkZJR19IV19ESVNLX0VOQ1JZUFRJT04KICNpbmNsdWRlICJjcnlwdGZzX2h3LmgiCkBAIC01MCw5ICs1MCw4IEBACiAjZGVmaW5lIFJTQV9FWFBPTkVOVCAweDEwMDAxCiAjZGVmaW5lIEtFWU1BU1RFUl9DUllQVEZTX1JBVEVfTElNSVQgMSAgLy8gTWF4aW11bSBvbmUgdHJ5IHBlciBzZWNvbmQKIAotc3RhdGljIGludCBrZXltYXN0ZXJfaW5pdChrZXltYXN0ZXIwX2RldmljZV90ICoqa2V5bWFzdGVyMF9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtleW1hc3RlcjFfZGV2aWNlX3QgKiprZXltYXN0ZXIxX2RldikKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2luaXQoa2V5bWFzdGVyMF9kZXZpY2VfdCoqIGtleW1hc3RlcjBfZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZXltYXN0ZXIxX2RldmljZV90Kioga2V5bWFzdGVyMV9kZXYpIHsKICAgICBpbnQgcmM7CiAKICAgICBjb25zdCBod19tb2R1bGVfdCogbW9kOwpAQCAtNzYsOCArNzUsOCBAQAogICAgIH0KIAogICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiY291bGQgbm90IG9wZW4ga2V5bWFzdGVyIGRldmljZSBpbiAlcyAoJXMpIiwKLSAgICAgICAgICAgICAgS0VZU1RPUkVfSEFSRFdBUkVfTU9EVUxFX0lELCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBvcGVuIGtleW1hc3RlciBkZXZpY2UgaW4gJXMgKCVzKSIsIEtFWVNUT1JFX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAgICAgICAgICAgc3RyZXJyb3IoLXJjKSk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtOTAsMTAgKzg5LDkgQEAKIH0KIAogLyogU2hvdWxkIHdlIHVzZSBrZXltYXN0ZXI/ICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5X29sZCgpCi17Ci0gICAga2V5bWFzdGVyMF9kZXZpY2VfdCAqa2V5bWFzdGVyMF9kZXYgPSAwOwotICAgIGtleW1hc3RlcjFfZGV2aWNlX3QgKmtleW1hc3RlcjFfZGV2ID0gMDsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHlfb2xkKCkgeworICAgIGtleW1hc3RlcjBfZGV2aWNlX3QqIGtleW1hc3RlcjBfZGV2ID0gMDsKKyAgICBrZXltYXN0ZXIxX2RldmljZV90KiBrZXltYXN0ZXIxX2RldiA9IDA7CiAgICAgaW50IHJjID0gMDsKIAogICAgIGlmIChrZXltYXN0ZXJfaW5pdCgma2V5bWFzdGVyMF9kZXYsICZrZXltYXN0ZXIxX2RldikpIHsKQEAgLTExNCw4ICsxMTIsNyBAQAogCiAgICAgLy8gVE9ETyhzd2lsbGRlbik6IENoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGFueSByZWFzb24gdG8gcmVxdWlyZSB2MC4zLiAgSSB0aGluayB2MC4xIGFuZCB2MC4yCiAgICAgLy8gc2hvdWxkIHdvcmsuCi0gICAgaWYgKGtleW1hc3RlcjBfZGV2LT5jb21tb24ubW9kdWxlLT5tb2R1bGVfYXBpX3ZlcnNpb24KLSAgICAgICAgICAgIDwgS0VZTUFTVEVSX01PRFVMRV9BUElfVkVSU0lPTl8wXzMpIHsKKyAgICBpZiAoa2V5bWFzdGVyMF9kZXYtPmNvbW1vbi5tb2R1bGUtPm1vZHVsZV9hcGlfdmVyc2lvbiA8IEtFWU1BU1RFUl9NT0RVTEVfQVBJX1ZFUlNJT05fMF8zKSB7CiAgICAgICAgIHJjID0gMDsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQpAQCAtMTM2LDExICsxMzMsMTAgQEAKIH0KIAogLyogQ3JlYXRlIGEgbmV3IGtleW1hc3RlciBrZXkgYW5kIHN0b3JlIGl0IGluIHRoaXMgZm9vdGVyICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9jcmVhdGVfa2V5X29sZChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyKQoteworc3RhdGljIGludCBrZXltYXN0ZXJfY3JlYXRlX2tleV9vbGQoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0cikgewogICAgIHVpbnQ4X3QqIGtleSA9IDA7Ci0gICAga2V5bWFzdGVyMF9kZXZpY2VfdCAqa2V5bWFzdGVyMF9kZXYgPSAwOwotICAgIGtleW1hc3RlcjFfZGV2aWNlX3QgKmtleW1hc3RlcjFfZGV2ID0gMDsKKyAgICBrZXltYXN0ZXIwX2RldmljZV90KiBrZXltYXN0ZXIwX2RldiA9IDA7CisgICAga2V5bWFzdGVyMV9kZXZpY2VfdCoga2V5bWFzdGVyMV9kZXYgPSAwOwogCiAgICAgaWYgKGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSkgewogICAgICAgICBTTE9HSSgiQWxyZWFkeSBoYXZlIGtleSIpOwpAQCAtMTc3LDExICsxNzMsMTAgQEAKICAgICAgICAgICAgIC8qIFJhdGUtbGltaXQga2V5IHVzYWdlIGF0dGVtcHRzLCB0byByYXRlLWxpbWl0IGJydXRlIGZvcmNlICovCiAgICAgICAgICAgICBrZXltYXN0ZXJfcGFyYW1faW50KEtNX1RBR19NSU5fU0VDT05EU19CRVRXRUVOX09QUywgS0VZTUFTVEVSX0NSWVBURlNfUkFURV9MSU1JVCksCiAgICAgICAgIH07Ci0gICAgICAgIGtleW1hc3Rlcl9rZXlfcGFyYW1fc2V0X3QgcGFyYW1fc2V0ID0geyBwYXJhbXMsIHNpemVvZihwYXJhbXMpL3NpemVvZigqcGFyYW1zKSB9OworICAgICAgICBrZXltYXN0ZXJfa2V5X3BhcmFtX3NldF90IHBhcmFtX3NldCA9IHtwYXJhbXMsIHNpemVvZihwYXJhbXMpIC8gc2l6ZW9mKCpwYXJhbXMpfTsKICAgICAgICAga2V5bWFzdGVyX2tleV9ibG9iX3Qga2V5X2Jsb2I7Ci0gICAgICAgIGtleW1hc3Rlcl9lcnJvcl90IGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmdlbmVyYXRlX2tleShrZXltYXN0ZXIxX2RldiwgJnBhcmFtX3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfYmxvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogY2hhcmFjdGVyaXN0aWNzICovKTsKKyAgICAgICAga2V5bWFzdGVyX2Vycm9yX3QgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+Z2VuZXJhdGVfa2V5KAorICAgICAgICAgICAga2V5bWFzdGVyMV9kZXYsICZwYXJhbV9zZXQsICZrZXlfYmxvYiwgTlVMTCAvKiBjaGFyYWN0ZXJpc3RpY3MgKi8pOwogICAgICAgICBpZiAoZXJyb3IgIT0gS01fRVJST1JfT0spIHsKICAgICAgICAgICAgIFNMT0dFKCJGYWlsZWQgdG8gZ2VuZXJhdGUga2V5bWFzdGVyMSBrZXksIGVycm9yICVkIiwgZXJyb3IpOwogICAgICAgICAgICAgcmMgPSAtMTsKQEAgLTE5MCwxNSArMTg1LDEzIEBACiAKICAgICAgICAga2V5ID0gKHVpbnQ4X3QqKWtleV9ibG9iLmtleV9tYXRlcmlhbDsKICAgICAgICAga2V5X3NpemUgPSBrZXlfYmxvYi5rZXlfbWF0ZXJpYWxfc2l6ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoa2V5bWFzdGVyMF9kZXYpIHsKKyAgICB9IGVsc2UgaWYgKGtleW1hc3RlcjBfZGV2KSB7CiAgICAgICAgIGtleW1hc3Rlcl9yc2Ffa2V5Z2VuX3BhcmFtc190IHBhcmFtczsKICAgICAgICAgbWVtc2V0KCZwYXJhbXMsICdcMCcsIHNpemVvZihwYXJhbXMpKTsKICAgICAgICAgcGFyYW1zLnB1YmxpY19leHBvbmVudCA9IFJTQV9FWFBPTkVOVDsKICAgICAgICAgcGFyYW1zLm1vZHVsdXNfc2l6ZSA9IFJTQV9LRVlfU0laRTsKIAotICAgICAgICBpZiAoa2V5bWFzdGVyMF9kZXYtPmdlbmVyYXRlX2tleXBhaXIoa2V5bWFzdGVyMF9kZXYsIFRZUEVfUlNBLCAmcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwgJmtleV9zaXplKSkgeworICAgICAgICBpZiAoa2V5bWFzdGVyMF9kZXYtPmdlbmVyYXRlX2tleXBhaXIoa2V5bWFzdGVyMF9kZXYsIFRZUEVfUlNBLCAmcGFyYW1zLCAma2V5LCAma2V5X3NpemUpKSB7CiAgICAgICAgICAgICBTTE9HRSgiRmFpbGVkIHRvIGdlbmVyYXRlIGtleXBhaXIiKTsKICAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgICAgICBnb3RvIG91dDsKQEAgLTIxOSwyNCArMjEyLDE5IEBACiAgICAgZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplID0ga2V5X3NpemU7CiAKIG91dDoKLSAgICBpZiAoa2V5bWFzdGVyMF9kZXYpCi0gICAgICAgIGtleW1hc3RlcjBfY2xvc2Uoa2V5bWFzdGVyMF9kZXYpOwotICAgIGlmIChrZXltYXN0ZXIxX2RldikKLSAgICAgICAga2V5bWFzdGVyMV9jbG9zZShrZXltYXN0ZXIxX2Rldik7CisgICAgaWYgKGtleW1hc3RlcjBfZGV2KSBrZXltYXN0ZXIwX2Nsb3NlKGtleW1hc3RlcjBfZGV2KTsKKyAgICBpZiAoa2V5bWFzdGVyMV9kZXYpIGtleW1hc3RlcjFfY2xvc2Uoa2V5bWFzdGVyMV9kZXYpOwogICAgIGZyZWUoa2V5KTsKICAgICByZXR1cm4gcmM7CiB9CiAKIC8qIFRoaXMgc2lnbnMgdGhlIGdpdmVuIG9iamVjdCB1c2luZyB0aGUga2V5bWFzdGVyIGtleS4gKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX3NpZ25fb2JqZWN0X29sZChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9iamVjdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKnNpZ25hdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqc2lnbmF0dXJlX3NpemUpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9zaWduX29iamVjdF9vbGQoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0ciwgY29uc3QgdW5zaWduZWQgY2hhciogb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvYmplY3Rfc2l6ZSwgdW5zaWduZWQgY2hhcioqIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHNpZ25hdHVyZV9zaXplKSB7CiAgICAgaW50IHJjID0gMDsKLSAgICBrZXltYXN0ZXIwX2RldmljZV90ICprZXltYXN0ZXIwX2RldiA9IDA7Ci0gICAga2V5bWFzdGVyMV9kZXZpY2VfdCAqa2V5bWFzdGVyMV9kZXYgPSAwOworICAgIGtleW1hc3RlcjBfZGV2aWNlX3QqIGtleW1hc3RlcjBfZGV2ID0gMDsKKyAgICBrZXltYXN0ZXIxX2RldmljZV90KiBrZXltYXN0ZXIxX2RldiA9IDA7CiAKICAgICB1bnNpZ25lZCBjaGFyIHRvX3NpZ25bUlNBX0tFWV9TSVpFX0JZVEVTXTsKICAgICBzaXplX3QgdG9fc2lnbl9zaXplID0gc2l6ZW9mKHRvX3NpZ24pOwpAQCAtMjg0LDMyICsyNzIsMjUgQEAKICAgICAgICAgcGFyYW1zLmRpZ2VzdF90eXBlID0gRElHRVNUX05PTkU7CiAgICAgICAgIHBhcmFtcy5wYWRkaW5nX3R5cGUgPSBQQURESU5HX05PTkU7CiAKLSAgICAgICAgcmMgPSBrZXltYXN0ZXIwX2Rldi0+c2lnbl9kYXRhKGtleW1hc3RlcjBfZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHItPmtleW1hc3Rlcl9ibG9iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3NpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3NpZ25fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfc2l6ZSk7CisgICAgICAgIHJjID0ga2V5bWFzdGVyMF9kZXYtPnNpZ25fZGF0YShrZXltYXN0ZXIwX2RldiwgJnBhcmFtcywgZnRyLT5rZXltYXN0ZXJfYmxvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSwgdG9fc2lnbiwgdG9fc2lnbl9zaXplLCBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfc2l6ZSk7CiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0gZWxzZSBpZiAoa2V5bWFzdGVyMV9kZXYpIHsKLSAgICAgICAga2V5bWFzdGVyX2tleV9ibG9iX3Qga2V5ID0geyBmdHItPmtleW1hc3Rlcl9ibG9iLCBmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUgfTsKKyAgICAgICAga2V5bWFzdGVyX2tleV9ibG9iX3Qga2V5ID0ge2Z0ci0+a2V5bWFzdGVyX2Jsb2IsIGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZX07CiAgICAgICAgIGtleW1hc3Rlcl9rZXlfcGFyYW1fdCBwYXJhbXNbXSA9IHsKICAgICAgICAgICAgIGtleW1hc3Rlcl9wYXJhbV9lbnVtKEtNX1RBR19QQURESU5HLCBLTV9QQURfTk9ORSksCiAgICAgICAgICAgICBrZXltYXN0ZXJfcGFyYW1fZW51bShLTV9UQUdfRElHRVNULCBLTV9ESUdFU1RfTk9ORSksCiAgICAgICAgIH07Ci0gICAgICAgIGtleW1hc3Rlcl9rZXlfcGFyYW1fc2V0X3QgcGFyYW1fc2V0ID0geyBwYXJhbXMsIHNpemVvZihwYXJhbXMpL3NpemVvZigqcGFyYW1zKSB9OworICAgICAgICBrZXltYXN0ZXJfa2V5X3BhcmFtX3NldF90IHBhcmFtX3NldCA9IHtwYXJhbXMsIHNpemVvZihwYXJhbXMpIC8gc2l6ZW9mKCpwYXJhbXMpfTsKICAgICAgICAga2V5bWFzdGVyX29wZXJhdGlvbl9oYW5kbGVfdCBvcF9oYW5kbGU7Ci0gICAgICAgIGtleW1hc3Rlcl9lcnJvcl90IGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmJlZ2luKGtleW1hc3RlcjFfZGV2LCBLTV9QVVJQT1NFX1NJR04sICZrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbV9zZXQsIE5VTEwgLyogb3V0X3BhcmFtcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wX2hhbmRsZSk7CisgICAgICAgIGtleW1hc3Rlcl9lcnJvcl90IGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmJlZ2luKAorICAgICAgICAgICAga2V5bWFzdGVyMV9kZXYsIEtNX1BVUlBPU0VfU0lHTiwgJmtleSwgJnBhcmFtX3NldCwgTlVMTCAvKiBvdXRfcGFyYW1zICovLCAmb3BfaGFuZGxlKTsKICAgICAgICAgaWYgKGVycm9yID09IEtNX0VSUk9SX0tFWV9SQVRFX0xJTUlUX0VYQ0VFREVEKSB7CiAgICAgICAgICAgICAvLyBLZXkgdXNhZ2UgaGFzIGJlZW4gcmF0ZS1saW1pdGVkLiAgV2FpdCBhIGJpdCBhbmQgdHJ5IGFnYWluLgogICAgICAgICAgICAgc2xlZXAoS0VZTUFTVEVSX0NSWVBURlNfUkFURV9MSU1JVCk7Ci0gICAgICAgICAgICBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5iZWdpbihrZXltYXN0ZXIxX2RldiwgS01fUFVSUE9TRV9TSUdOLCAma2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtX3NldCwgTlVMTCAvKiBvdXRfcGFyYW1zICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wX2hhbmRsZSk7CisgICAgICAgICAgICBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5iZWdpbihrZXltYXN0ZXIxX2RldiwgS01fUFVSUE9TRV9TSUdOLCAma2V5LCAmcGFyYW1fc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBvdXRfcGFyYW1zICovLCAmb3BfaGFuZGxlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZXJyb3IgIT0gS01fRVJST1JfT0spIHsKICAgICAgICAgICAgIFNMT0dFKCJFcnJvciBzdGFydGluZyBrZXltYXN0ZXIgc2lnbmF0dXJlIHRyYW5zYWN0aW9uOiAlZCIsIGVycm9yKTsKQEAgLTMxNywxMSArMjk4LDEwIEBACiAgICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICAgfQogCi0gICAgICAgIGtleW1hc3Rlcl9ibG9iX3QgaW5wdXQgPSB7IHRvX3NpZ24sIHRvX3NpZ25fc2l6ZSB9OworICAgICAgICBrZXltYXN0ZXJfYmxvYl90IGlucHV0ID0ge3RvX3NpZ24sIHRvX3NpZ25fc2l6ZX07CiAgICAgICAgIHNpemVfdCBpbnB1dF9jb25zdW1lZDsKLSAgICAgICAgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+dXBkYXRlKGtleW1hc3RlcjFfZGV2LCBvcF9oYW5kbGUsIE5VTEwgLyogaW5fcGFyYW1zICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LCAmaW5wdXRfY29uc3VtZWQsIE5VTEwgLyogb3V0X3BhcmFtcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogb3V0cHV0ICovKTsKKyAgICAgICAgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+dXBkYXRlKGtleW1hc3RlcjFfZGV2LCBvcF9oYW5kbGUsIE5VTEwgLyogaW5fcGFyYW1zICovLCAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRfY29uc3VtZWQsIE5VTEwgLyogb3V0X3BhcmFtcyAqLywgTlVMTCAvKiBvdXRwdXQgKi8pOwogICAgICAgICBpZiAoZXJyb3IgIT0gS01fRVJST1JfT0spIHsKICAgICAgICAgICAgIFNMT0dFKCJFcnJvciBzZW5kaW5nIGRhdGEgdG8ga2V5bWFzdGVyIHNpZ25hdHVyZSB0cmFuc2FjdGlvbjogJWQiLCBlcnJvcik7CiAgICAgICAgICAgICByYyA9IC0xOwpAQCAtMzM3LDggKzMxNyw3IEBACiAKICAgICAgICAga2V5bWFzdGVyX2Jsb2JfdCB0bXBfc2lnOwogICAgICAgICBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5maW5pc2goa2V5bWFzdGVyMV9kZXYsIG9wX2hhbmRsZSwgTlVMTCAvKiBpbl9wYXJhbXMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIHZlcmlmeSBzaWduYXR1cmUgKi8sIE5VTEwgLyogb3V0X3BhcmFtcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfc2lnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogdmVyaWZ5IHNpZ25hdHVyZSAqLywgTlVMTCAvKiBvdXRfcGFyYW1zICovLCAmdG1wX3NpZyk7CiAgICAgICAgIGlmIChlcnJvciAhPSBLTV9FUlJPUl9PSykgewogICAgICAgICAgICAgU0xPR0UoIkVycm9yIGZpbmlzaGluZyBrZXltYXN0ZXIgc2lnbmF0dXJlIHRyYW5zYWN0aW9uOiAlZCIsIGVycm9yKTsKICAgICAgICAgICAgIHJjID0gLTE7CkBAIC0zNTMsMTkgKzMzMiwxNSBAQAogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKLSAgICBvdXQ6Ci0gICAgICAgIGlmIChrZXltYXN0ZXIxX2RldikKLSAgICAgICAgICAgIGtleW1hc3RlcjFfY2xvc2Uoa2V5bWFzdGVyMV9kZXYpOwotICAgICAgICBpZiAoa2V5bWFzdGVyMF9kZXYpCi0gICAgICAgICAgICBrZXltYXN0ZXIwX2Nsb3NlKGtleW1hc3RlcjBfZGV2KTsKK291dDoKKyAgICBpZiAoa2V5bWFzdGVyMV9kZXYpIGtleW1hc3RlcjFfY2xvc2Uoa2V5bWFzdGVyMV9kZXYpOworICAgIGlmIChrZXltYXN0ZXIwX2Rldikga2V5bWFzdGVyMF9jbG9zZShrZXltYXN0ZXIwX2Rldik7CiAKLSAgICAgICAgcmV0dXJuIHJjOworICAgIHJldHVybiByYzsKIH0KIAotCiAvKiBTaG91bGQgd2UgdXNlIGtleW1hc3Rlcj8gKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHlfbmV3KCkKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHlfbmV3KCkgewogICAgIHJldHVybiBrZXltYXN0ZXJfY29tcGF0aWJpbGl0eV9jcnlwdGZzX3NjcnlwdCgpOwogfQogCkBAIC0zOTQsMTIgKzM2OSw5IEBACiAjZW5kaWYKIAogLyogVGhpcyBzaWducyB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIHRoZSBrZXltYXN0ZXIga2V5LiAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfc2lnbl9vYmplY3RfbmV3KHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgb2JqZWN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqc2lnbmF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzaWduYXR1cmVfc2l6ZSkKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX3NpZ25fb2JqZWN0X25ldyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9iamVjdF9zaXplLCB1bnNpZ25lZCBjaGFyKiogc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogc2lnbmF0dXJlX3NpemUpIHsKICAgICB1bnNpZ25lZCBjaGFyIHRvX3NpZ25bUlNBX0tFWV9TSVpFX0JZVEVTXTsKICAgICBzaXplX3QgdG9fc2lnbl9zaXplID0gc2l6ZW9mKHRvX3NpZ24pOwogICAgIG1lbXNldCh0b19zaWduLCAwLCBSU0FfS0VZX1NJWkVfQllURVMpOwpAQCAtNDQzLDEyICs0MTUsMTAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQ3J5cHRGc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgfQorICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHt9CiB9OwogCiBURVNUX0YoQ3J5cHRGc1Rlc3QsIFNjcnlwdEhpZGxpemF0aW9uRXF1aXZhbGVuY2VUZXN0KSB7CkBAIC00NTgsOCArNDI4LDggQEAKIAogICAgIEFTU0VSVF9FUSgwLCBrZXltYXN0ZXJfY3JlYXRlX2tleV9vbGQoJmZ0cikpOwogCi0gICAgdWludDhfdCAqc2lnMSA9IG51bGxwdHI7Ci0gICAgdWludDhfdCAqc2lnMiA9IG51bGxwdHI7CisgICAgdWludDhfdCogc2lnMSA9IG51bGxwdHI7CisgICAgdWludDhfdCogc2lnMiA9IG51bGxwdHI7CiAgICAgc2l6ZV90IHNpZ19zaXplMSA9IDEyMzQ1Njc4OTsKICAgICBzaXplX3Qgc2lnX3NpemUyID0gMTIzNDU2Nzg5OwogICAgIHVpbnQ4X3Qgb2JqZWN0W10gPSAidGhlIG9iamVjdCI7CkBAIC00NzcsNCArNDQ3LDQgQEAKICAgICBmcmVlKHNpZzIpOwogfQogCi19Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvVXRpbHNfdGVzdC5jcHAgYi90ZXN0cy9VdGlsc190ZXN0LmNwcAppbmRleCBhYjk4MDllLi5lMTZjYmFjIDEwMDY0NAotLS0gYS90ZXN0cy9VdGlsc190ZXN0LmNwcAorKysgYi90ZXN0cy9VdGlsc190ZXN0LmNwcApAQCAtMjEsOCArMjEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewogCi1jbGFzcyBVdGlsc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OworY2xhc3MgVXRpbHNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3Qge307CiAKIFRFU1RfRihVdGlsc1Rlc3QsIEZpbmRWYWx1ZVRlc3QpIHsKICAgICBzdGQ6OnN0cmluZyB0bXA7CkBAIC00MCw1ICszOSw1IEBACiAgICAgQVNTRVJUX0VRKCJCQVoiLCB0bXApOwogfQogCi19Ci19Cit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2NyeXB0ZnNfdGVzdC5jcHAgYi90ZXN0cy9jcnlwdGZzX3Rlc3QuY3BwCmluZGV4IDY4NzVjMGYuLjIwOTM3NjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NyeXB0ZnNfdGVzdC5jcHAKKysrIGIvdGVzdHMvY3J5cHRmc190ZXN0LmNwcApAQCAtMjEsMTIgKzIxLDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIENyeXB0ZnNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICB9CisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQogfTsKIAogVEVTVF9GKENyeXB0ZnNUZXN0LCBNYXRjaE11bHRpRW50cnlUZXN0KSB7CkBAIC01MSw0ICs0OSw0IEBACiAgICAgQVNTRVJUX0VRKDAsIG1hdGNoX211bHRpX2VudHJ5KCJmb29fMiIsICJiYXIiLCAwKSk7CiB9CiAKLX0KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS92ZGMuY3BwIGIvdmRjLmNwcAppbmRleCAzYzQ0OWFlLi5mNDlkNmI4IDEwMDY0NAotLS0gYS92ZGMuY3BwCisrKyBiL3ZkYy5jcHAKQEAgLTE0LDE1ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CkBAIC0zOCw3ICszNyw3IEBACiAKICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAotc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqcHJvZ25hbWUpOworc3RhdGljIHZvaWQgdXNhZ2UoY2hhciogcHJvZ25hbWUpOwogCiBzdGF0aWMgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SUJpbmRlcj4gZ2V0U2VydmljZUFnZ3Jlc3NpdmUoKSB7CiAgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SUJpbmRlcj4gcmVzOwpAQCAtNTAsNyArNDksNyBAQAogICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJXYWl0ZWQgIiA8PCAoaSAqIDEwKSA8PCAibXMgZm9yIHZvbGQiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgdXNsZWVwKDEwMDAwKTsgLy8gMTBtcworICAgICAgICB1c2xlZXAoMTAwMDApOyAgLy8gMTBtcwogICAgIH0KICAgICByZXR1cm4gcmVzOwogfQpAQCAtMTEyLDYgKzExMSw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHVzYWdlKGNoYXIgKnByb2duYW1lKSB7CitzdGF0aWMgdm9pZCB1c2FnZShjaGFyKiBwcm9nbmFtZSkgewogICAgIExPRyhJTkZPKSA8PCAiVXNhZ2U6ICIgPDwgcHJvZ25hbWUgPDwgIiBbLS13YWl0XSA8c3lzdGVtPiA8c3ViY29tbWFuZD4gW2FyZ3MuLi5dIjsKIH0K