ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGIyMDdhOTYuLmEzNjc5YjEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw2ICsyLDUgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKLSAgICAicmFkaW8iLAogICAgICJzb3VuZHRyaWdnZXIiLAogXQpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IDVlNGQ4MWQuLmYzOTQ2ZjAgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTc4LDYgKzc4LDcgQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvc291bmRmeC9saWJidW5kbGV3cmFwcGVyLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9zb3VuZGZ4L2xpYmF1ZGlvcHJlcHJvY2Vzc2luZy5zbykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGlibWVkaWFjb2RlY3NlcnZpY2Uuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3htbHBhcnNlckAxLjAuc28pCiAKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVApkaWZmIC0tZ2l0IGEvT1dORVJTIGIvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDA1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9PV05FUlMKQEAgLTAsMCArMSw0IEBACitlbGF1cmVudEBnb29nbGUuY29tCitldGFsdmFsYUBnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NhbWVyYS9PV05FUlMgYi9jYW1lcmEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWNmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvT1dORVJTCkBAIC0wLDAgKzEsNiBAQAorY3ljaGVuQGdvb2dsZS5jb20KK2VwZWV2QGdvb2dsZS5jb20KK2V0YWx2YWxhQGdvb2dsZS5jb20KK3NodXpoZW53YW5nQGdvb2dsZS5jb20KK3lpbmNoaWF5ZWhAZ29vZ2xlLmNvbQoremhpanVuaGVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvY21kcy9PV05FUlMgYi9jbWRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDMyYWFjCi0tLSAvZGV2L251bGwKKysrIGIvY21kcy9PV05FUlMKQEAgLTAsMCArMSwzIEBACitlbGF1cmVudEBnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2RybS9PV05FUlMgYi9kcm0vT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODg3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vT1dORVJTCkBAIC0wLDAgKzEgQEAKK2p0aW5rZXJAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA2NmY1ZmMyLi5mOTA2NTY0IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtNSwzNiArNSwzMSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYWRybSIsCiAKLSAgICBhaWRsOiB7Ci0gICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJhaWRsIl0sCi0gICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCi0gICAgfSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsIiwKLQotICAgICAgICAiQ2FzSW1wbC5jcHAiLAotICAgICAgICAiRGVzY3JhbWJsZXJJbXBsLmNwcCIsCiAgICAgICAgICJEcm1QbHVnaW5QYXRoLmNwcCIsCiAgICAgICAgICJEcm1TZXNzaW9uTWFuYWdlci5jcHAiLAogICAgICAgICAiSUNyeXB0by5jcHAiLAogICAgICAgICAiSURybS5jcHAiLAogICAgICAgICAiSURybUNsaWVudC5jcHAiLAogICAgICAgICAiSU1lZGlhRHJtU2VydmljZS5jcHAiLAotICAgICAgICAiTWVkaWFDYXNEZWZzLmNwcCIsCisgICAgICAgICJQbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcCIsCiAgICAgICAgICJTaGFyZWRMaWJyYXJ5LmNwcCIsCiAgICAgICAgICJEcm1IYWwuY3BwIiwKICAgICAgICAgIkNyeXB0b0hhbC5jcHAiLAorICAgICAgICAicHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvIiwKICAgICBdLAogCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ2FzSW1wbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vQ2FzSW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzNiYjAuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkNhc0ltcGwiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9DYXNBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9DYXNJbXBsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBTdGF0dXMgZ2V0QmluZGVyU3RhdHVzKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5UKTsKLSAgICB9Ci0gICAgaWYgKGVyciA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfU1RBVEUpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoZXJyKTsKLX0KLQotc3RhdGljIFN0cmluZzggc2Vzc2lvbklkVG9TdHJpbmcoY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQpIHsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlc3Npb25JZC5zaXplKCk7IGkrKykgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMDJ4ICIsIHNlc3Npb25JZFtpXSk7Ci0gICAgfQotICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIihudWxsKSIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJ1Y3QgQ2FzSW1wbDo6UGx1Z2luSG9sZGVyIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotICAgIGV4cGxpY2l0IFBsdWdpbkhvbGRlcihDYXNQbHVnaW4gKnBsdWdpbikgOiBtUGx1Z2luKHBsdWdpbikge30KLSAgICB+UGx1Z2luSG9sZGVyKCkgeyBpZiAobVBsdWdpbiAhPSBOVUxMKSBkZWxldGUgbVBsdWdpbjsgfQotICAgIENhc1BsdWdpbiogZ2V0KCkgeyByZXR1cm4gbVBsdWdpbjsgfQotCi1wcml2YXRlOgotICAgIENhc1BsdWdpbiAqbVBsdWdpbjsKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQbHVnaW5Ib2xkZXIpOwotfTsKLQotQ2FzSW1wbDo6Q2FzSW1wbChjb25zdCBzcDxJQ2FzTGlzdGVuZXI+ICZsaXN0ZW5lcikKLSAgICA6IG1QbHVnaW5Ib2xkZXIoTlVMTCksIG1MaXN0ZW5lcihsaXN0ZW5lcikgewotICAgIEFMT0dWKCJDVE9SIik7Ci19Ci0KLUNhc0ltcGw6On5DYXNJbXBsKCkgewotICAgIEFMT0dWKCJEVE9SIik7Ci0gICAgcmVsZWFzZSgpOwotfQotCi0vL3N0YXRpYwotdm9pZCBDYXNJbXBsOjpPbkV2ZW50KAotICAgICAgICB2b2lkICphcHBEYXRhLAotICAgICAgICBpbnQzMl90IGV2ZW50LAotICAgICAgICBpbnQzMl90IGFyZywKLSAgICAgICAgdWludDhfdCAqZGF0YSwKLSAgICAgICAgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoYXBwRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGFwcERhdGEhIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ2FzSW1wbCAqY2FzSW1wbCA9IHN0YXRpY19jYXN0PENhc0ltcGwgKj4oYXBwRGF0YSk7Ci0gICAgY2FzSW1wbC0+b25FdmVudChldmVudCwgYXJnLCBkYXRhLCBzaXplKTsKLX0KLQotdm9pZCBDYXNJbXBsOjppbml0KGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBDYXNQbHVnaW4gKnBsdWdpbikgewotICAgIG1MaWJyYXJ5ID0gbGlicmFyeTsKLSAgICBtUGx1Z2luSG9sZGVyID0gbmV3IFBsdWdpbkhvbGRlcihwbHVnaW4pOwotfQotCi12b2lkIENhc0ltcGw6Om9uRXZlbnQoCi0gICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtTGlzdGVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+IGV2ZW50RGF0YTsKLSAgICBpZiAoZGF0YSAhPSBOVUxMICYmIHNpemUgPiAwKSB7Ci0gICAgICAgIGV2ZW50RGF0YS5yZXNldChuZXcgQ2FzRGF0YShkYXRhLCBkYXRhICsgc2l6ZSkpOwotICAgIH0KLQotICAgIG1MaXN0ZW5lci0+b25FdmVudChldmVudCwgYXJnLCBldmVudERhdGEpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6c2V0UHJpdmF0ZURhdGEoY29uc3QgQ2FzRGF0YSYgcHZ0RGF0YSkgewotICAgIEFMT0dWKCJzZXRQcml2YXRlRGF0YSIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+c2V0UHJpdmF0ZURhdGEocHZ0RGF0YSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6b3BlblNlc3Npb24oQ2FzU2Vzc2lvbklkKiBzZXNzaW9uSWQpIHsKLSAgICBBTE9HVigib3BlblNlc3Npb24iKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnIgPSBob2xkZXItPmdldCgpLT5vcGVuU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgQUxPR1YoIm9wZW5TZXNzaW9uOiBzZXNzaW9uIG9wZW5lZCwgc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKCpzZXNzaW9uSWQpLnN0cmluZygpKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnNldFNlc3Npb25Qcml2YXRlRGF0YSgKLSAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIHsKLSAgICBBTE9HVigic2V0U2Vzc2lvblByaXZhdGVEYXRhOiBzZXNzaW9uSWQ9JXMiLAotICAgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhob2xkZXItPmdldCgpLT5zZXRTZXNzaW9uUHJpdmF0ZURhdGEoc2Vzc2lvbklkLCBwdnREYXRhKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpjbG9zZVNlc3Npb24oY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQpIHsKLSAgICBBTE9HVigiY2xvc2VTZXNzaW9uOiBzZXNzaW9uSWQ9JXMiLAotICAgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhob2xkZXItPmdldCgpLT5jbG9zZVNlc3Npb24oc2Vzc2lvbklkKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpwcm9jZXNzRWNtKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBjb25zdCBQYXJjZWxhYmxlQ2FzRGF0YSYgZWNtKSB7Ci0gICAgQUxPR1YoInByb2Nlc3NFY206IHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+cHJvY2Vzc0VjbShzZXNzaW9uSWQsIGVjbSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cHJvY2Vzc0VtbShjb25zdCBQYXJjZWxhYmxlQ2FzRGF0YSYgZW1tKSB7Ci0gICAgQUxPR1YoInByb2Nlc3NFbW0iKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+cHJvY2Vzc0VtbShlbW0pKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnNlbmRFdmVudCgKLSAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+ICZldmVudERhdGEpIHsKLSAgICBBTE9HVigic2VuZEV2ZW50Iik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKGV2ZW50RGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnNlbmRFdmVudChldmVudCwgYXJnLCBDYXNEYXRhKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnNlbmRFdmVudChldmVudCwgYXJnLCAqZXZlbnREYXRhKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhlcnIpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cHJvdmlzaW9uKGNvbnN0IFN0cmluZzE2JiBwcm92aXNpb25TdHJpbmcpIHsKLSAgICBBTE9HVigicHJvdmlzaW9uOiBwcm92aXNpb25TdHJpbmc9JXMiLCBTdHJpbmc4KHByb3Zpc2lvblN0cmluZykuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhob2xkZXItPmdldCgpLT5wcm92aXNpb24oU3RyaW5nOChwcm92aXNpb25TdHJpbmcpKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpyZWZyZXNoRW50aXRsZW1lbnRzKAotICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmcmVmcmVzaERhdGEpIHsKLSAgICBBTE9HVigicmVmcmVzaEVudGl0bGVtZW50cyIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmIChyZWZyZXNoRGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnJlZnJlc2hFbnRpdGxlbWVudHMocmVmcmVzaFR5cGUsIENhc0RhdGEoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gaG9sZGVyLT5nZXQoKS0+cmVmcmVzaEVudGl0bGVtZW50cyhyZWZyZXNoVHlwZSwgKnJlZnJlc2hEYXRhKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhlcnIpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cmVsZWFzZSgpIHsKLSAgICBBTE9HVigicmVsZWFzZTogcGx1Z2luPSVwIiwKLSAgICAgICAgICAgIG1QbHVnaW5Ib2xkZXIgPT0gTlVMTCA/IG1QbHVnaW5Ib2xkZXItPmdldCgpIDogTlVMTCk7Ci0gICAgbVBsdWdpbkhvbGRlci5jbGVhcigpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRGVzY3JhbWJsZXJJbXBsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlMDllMi4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRGVzY3JhbWJsZXJJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEZXNjcmFtYmxlckltcGwiCi0KLSNpbmNsdWRlIDxtZWRpYS9jYXMvRGVzY3JhbWJsZXJBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9EZXNjcmFtYmxlckltcGwuaD4KLSNpbmNsdWRlIDxtZWRpYS9TaGFyZWRMaWJyYXJ5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgU3RhdHVzIGdldEJpbmRlclN0YXR1cyhzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX1NUQVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycik7Ci19Ci0KLXN0YXRpYyBTdHJpbmc4IHNlc3Npb25JZFRvU3RyaW5nKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXNzaW9uSWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCAiLCBzZXNzaW9uSWRbaV0pOwotICAgIH0KLSAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIobnVsbCkiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRGVzY3JhbWJsZXJJbXBsOjpEZXNjcmFtYmxlckltcGwoCi0gICAgICAgIGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luKSA6Ci0gICAgICAgIG1MaWJyYXJ5KGxpYnJhcnkpLCBtUGx1Z2luKHBsdWdpbikgewotICAgIEFMT0dWKCJDVE9SOiBtUGx1Z2luPSVwIiwgbVBsdWdpbik7Ci19Ci0KLURlc2NyYW1ibGVySW1wbDo6fkRlc2NyYW1ibGVySW1wbCgpIHsKLSAgICBBTE9HVigiRFRPUjogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotICAgIHJlbGVhc2UoKTsKLX0KLQotU3RhdHVzIERlc2NyYW1ibGVySW1wbDo6c2V0TWVkaWFDYXNTZXNzaW9uKGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoInNldE1lZGlhQ2FzU2Vzc2lvbjogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhtUGx1Z2luLT5zZXRNZWRpYUNhc1Nlc3Npb24oc2Vzc2lvbklkKSk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudCgKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIG1pbWUsIGJvb2wgKnJlc3VsdCkgewotICAgICpyZXN1bHQgPSBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoU3RyaW5nOChtaW1lKSk7Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKE9LKTsKLX0KLQotU3RhdHVzIERlc2NyYW1ibGVySW1wbDo6ZGVzY3JhbWJsZSgKLSAgICAgICAgY29uc3QgRGVzY3JhbWJsZUluZm8mIGluZm8sIGludDMyX3QgKnJlc3VsdCkgewotICAgIEFMT0dWKCJkZXNjcmFtYmxlIik7Ci0KLSAgICAqcmVzdWx0ID0gbVBsdWdpbi0+ZGVzY3JhbWJsZSgKLSAgICAgICAgICAgIGluZm8uZHN0VHlwZSAhPSBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlciwKLSAgICAgICAgICAgIGluZm8uc2NyYW1ibGluZ0NvbnRyb2wsCi0gICAgICAgICAgICBpbmZvLm51bVN1YlNhbXBsZXMsCi0gICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXMsCi0gICAgICAgICAgICBpbmZvLnNyY01lbS0+cG9pbnRlcigpLAotICAgICAgICAgICAgaW5mby5zcmNPZmZzZXQsCi0gICAgICAgICAgICBpbmZvLmRzdFR5cGUgPT0gRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIgPwotICAgICAgICAgICAgICAgICAgICBpbmZvLnNyY01lbS0+cG9pbnRlcigpIDogaW5mby5kc3RQdHIsCi0gICAgICAgICAgICBpbmZvLmRzdE9mZnNldCwKLSAgICAgICAgICAgIE5VTEwpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cygqcmVzdWx0ID49IDAgPyBPSyA6ICpyZXN1bHQpOwotfQotCi1TdGF0dXMgRGVzY3JhbWJsZXJJbXBsOjpyZWxlYXNlKCkgewotICAgIEFMT0dWKCJyZWxlYXNlOiBtUGx1Z2luPSVwIiwgbVBsdWdpbik7Ci0KLSAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtUGx1Z2luOwotICAgICAgICBtUGx1Z2luID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCmluZGV4IDM4NjU0NmYuLjMxNTBlM2MgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvRHJtSGFsLmg+CiAjaW5jbHVkZSA8bWVkaWEvRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oPgogI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgpAQCAtMTk0LDcgKzE5NSwxOCBAQAogICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkgewogfQogCit2b2lkIERybUhhbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7CisgICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMobU9wZW5TZXNzaW9uc1tpXSkpOworICAgICAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obU9wZW5TZXNzaW9uc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbU9wZW5TZXNzaW9ucy5jbGVhcigpOworfQorCiBEcm1IYWw6On5Ecm1IYWwoKSB7CisgICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlRHJtKG1Ecm1TZXNzaW9uQ2xpZW50KTsKIH0KIApAQCAtNDA1LDExICs0MTcsMTIgQEAKIAogc3RhdHVzX3QgRHJtSGFsOjpkZXN0cm95UGx1Z2luKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKICAgICB9CiAKKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOworICAgIHJlcG9ydE1ldHJpY3MoKTsKICAgICBzZXRMaXN0ZW5lcihOVUxMKTsKICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CiAgICAgICAgIG1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpOwpAQCAtNDYxLDYgKzQ3NCw3IEBACiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+YWRkU2Vzc2lvbihnZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgbURybVNlc3Npb25DbGllbnQsIHNlc3Npb25JZCk7CisgICAgICAgIG1PcGVuU2Vzc2lvbnMucHVzaChzZXNzaW9uSWQpOwogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQpAQCAtNDc1LDcgKzQ4OSwxNCBAQAogICAgIFN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5jbG9zZVNlc3Npb24odG9IaWRsVmVjKHNlc3Npb25JZCkpOwogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewogICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtT3BlblNlc3Npb25zW2ldID09IHNlc3Npb25JZCkgeworICAgICAgICAgICAgICAgIG1PcGVuU2Vzc2lvbnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisgICAgcmVwb3J0TWV0cmljcygpOwogICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdHVzKTsKIH0KIApAQCAtNzI3LDYgKzc0OCwxMiBAQAogCiBzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwobmFtZSwgdmFsdWUpOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCisgICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CkBAIC03NDgsNiArNzc1LDEyIEBACiAKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdCB7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgY2xhc3MgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZQorICAgIC8vIG1Mb2NrIGlzIGFscmVhZHkgaGVsZC4KIAogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwpAQCAtOTYyLDYgKzk5NSw3IEBACiB2b2lkIERybUhhbDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvIF9fdW51c2VkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKICAgICBzZXRMaXN0ZW5lcihOVUxMKTsKICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CiAgICAgICAgIG1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpOwpAQCAtOTgwLDQgKzEwMTQsMjAgQEAKICAgICB9CiB9CiAKK3ZvaWQgRHJtSGFsOjpyZXBvcnRNZXRyaWNzKCkgY29uc3QKK3sKKyAgICBWZWN0b3I8dWludDhfdD4gbWV0cmljczsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIGlmIChnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCB2ZW5kb3IpID09IE9LICYmCisgICAgICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKSA9PSBPSyAmJgorICAgICAgICAgICAgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4KCJtZXRyaWNzIiksIG1ldHJpY3MpID09IE9LKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGFuZHJvaWQ6OnJlcG9ydERybVBsdWdpbk1ldHJpY3MoCisgICAgICAgICAgICAgICAgbWV0cmljcywgdmVuZG9yLCBkZXNjcmlwdGlvbik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWNzIHdlcmUgcmV0cmlldmVkIGJ1dCBjb3VsZCBub3QgYmUgcmVwb3J0ZWQ6ICVpIiwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9NZWRpYUNhc0RlZnMuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmJhMzguLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQ2FzIgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDYXNEZWZzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotbmFtZXNwYWNlIE1lZGlhQ2FzIHsKLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc0RhdGE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgcmV0dXJuIHBhcmNlbC0+cmVhZEJ5dGVWZWN0b3IodGhpcyk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbGFibGVDYXNEYXRhOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCAgewotICAgIHJldHVybiBwYXJjZWwtPndyaXRlQnl0ZVZlY3RvcigqdGhpcyk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogLypwYXJjZWwqLykgewotICAgIEFMT0dFKCJDQVBsdWdpbkRlc2NyaXB0b3I6OnJlYWRGcm9tUGFyY2VsKCkgc2hvdWxkbid0IGJlIGNhbGxlZCIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUNBU3lzdGVtSWQpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihtTmFtZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIE1lZGlhQ2FzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLW5hbWVzcGFjZSBNZWRpYURlc2NyYW1ibGVyIHsKLQotRGVzY3JhbWJsZUluZm86OkRlc2NyYW1ibGVJbmZvKCkge30KLQotRGVzY3JhbWJsZUluZm86On5EZXNjcmFtYmxlSW5mbygpIHt9Ci0KLXN0YXR1c190IERlc2NyYW1ibGVJbmZvOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+cmVhZEludDMyKChpbnQzMl90KikmZHN0VHlwZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAoZHN0VHlwZSAhPSBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlCi0gICAgICAgICAgICAmJiBkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigoaW50MzJfdCopJnNjcmFtYmxpbmdDb250cm9sKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCh1aW50MzJfdCopJm51bVN1YlNhbXBsZXMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgaWYgKG51bVN1YlNhbXBsZXMgPiAweGZmZmYpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBzdWJTYW1wbGVzID0gbmV3IERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGVbbnVtU3ViU2FtcGxlc107Ci0gICAgaWYgKHN1YlNhbXBsZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGVyciA9IHBhcmNlbC0+cmVhZFVpbnQzMigmc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCZzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcmNNZW0gPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgaWYgKHNyY01lbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnNyY09mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmF0aXZlSGFuZGxlID0gTlVMTDsKLSAgICBpZiAoZHN0VHlwZSA9PSBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7Ci0gICAgICAgIG5hdGl2ZUhhbmRsZSA9IHBhcmNlbC0+cmVhZE5hdGl2ZUhhbmRsZSgpOwotICAgICAgICBkc3RQdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KG5hdGl2ZUhhbmRsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0UHRyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmZHN0T2Zmc2V0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXNjcmFtYmxlSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIGlmIChkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUKLSAgICAgICAgICAgICYmIGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdClkc3RUeXBlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKHNjcmFtYmxpbmdDb250cm9sKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZVVpbnQzMihudW1TdWJTYW1wbGVzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZXJyID0gcGFyY2VsLT53cml0ZVVpbnQzMihzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc3JjTWVtKSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihzcmNPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoZHN0VHlwZSA9PSBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVOYXRpdmVIYW5kbGUoc3RhdGljX2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KGRzdFB0cikpOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihkc3RPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIKLQotfSAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzAyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlBsdWdpbk1ldHJpY3NSZXBvcnRpbmciCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKworI2luY2x1ZGUgInByb3Rvcy9wbHVnaW5fbWV0cmljcy5wYi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXA7Cit1c2luZyBhbmRyb2lkOjpkcm1fbWV0cmljczo6TWV0cmljc0dyb3VwX01ldHJpYzsKK3VzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXBfTWV0cmljX01ldHJpY1ZhbHVlOworCitjb25zdCBjaGFyKiBjb25zdCBrUGFyZW50QXR0cmlidXRlID0gIi9wYXJlbnQvZXh0ZXJuYWwiOworCitzdGF0dXNfdCByZXBvcnRNZXRyaWNzR3JvdXAoY29uc3QgTWV0cmljc0dyb3VwJiBtZXRyaWNzR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYmF0Y2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIHBhcmVudElkKSB7CisgICAgTWVkaWFBbmFseXRpY3NJdGVtIGFuYWx5dGljc0l0ZW0oYmF0Y2hOYW1lLmNfc3RyKCkpOworICAgIGFuYWx5dGljc0l0ZW0uZ2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBpbnQ2NF90IHNlc3Npb25JZCA9IGFuYWx5dGljc0l0ZW0uZ2V0U2Vzc2lvbklEKCk7CisgICAgaWYgKHBhcmVudElkICE9IE5VTEwpIHsKKyAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRJbnQ2NChrUGFyZW50QXR0cmlidXRlLCAqcGFyZW50SWQpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0cmljc0dyb3VwLm1ldHJpY19zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBNZXRyaWNzR3JvdXBfTWV0cmljJiBtZXRyaWMgPSBtZXRyaWNzR3JvdXAubWV0cmljKGkpOworICAgICAgICBpZiAoIW1ldHJpYy5oYXNfbmFtZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0cmljIHdpdGggbm8gbmFtZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1ldHJpYy5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyB3aXRoIG5vIHZhbHVlLiIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IE1ldHJpY3NHcm91cF9NZXRyaWNfTWV0cmljVmFsdWUmIHZhbHVlID0gbWV0cmljLnZhbHVlKCk7CisgICAgICAgIGlmICh2YWx1ZS5oYXNfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIGFuYWx5dGljc0l0ZW0uc2V0SW50NjQobWV0cmljLm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5pbnRfdmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaGFzX2RvdWJsZV92YWx1ZSgpKSB7CisgICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldERvdWJsZShtZXRyaWMubmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5kb3VibGVfdmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldENTdHJpbmcobWV0cmljLm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnN0cmluZ192YWx1ZSgpLmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyBWYWx1ZSB3aXRoIG5vIGFjdHVhbCB2YWx1ZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhbmFseXRpY3NJdGVtLnNldEZpbmFsaXplZCh0cnVlKTsKKyAgICBhbmFseXRpY3NJdGVtLnNlbGZyZWNvcmQoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0cmljc0dyb3VwLm1ldHJpY19zdWJfZ3JvdXBfc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgTWV0cmljc0dyb3VwJiBzdWJHcm91cCA9IG1ldHJpY3NHcm91cC5tZXRyaWNfc3ViX2dyb3VwKGkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBvcnRNZXRyaWNzR3JvdXAoc3ViR3JvdXAsIGJhdGNoTmFtZSwgJnNlc3Npb25JZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmluZzggc2FuaXRpemUoY29uc3QgU3RyaW5nOCYgaW5wdXQpIHsKKyAgICAvLyBGaWx0ZXJzIHRoZSBpbnB1dCBzdHJpbmcgZG93biB0byBqdXN0IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLgorICAgIFN0cmluZzggb3V0cHV0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY2hhciBjYW5kaWRhdGUgPSBpbnB1dFtpXTsKKyAgICAgICAgaWYgKChjYW5kaWRhdGUgPj0gJ2EnICYmIGNhbmRpZGF0ZSA8PSAneicpIHx8CisgICAgICAgICAgICAgICAgKGNhbmRpZGF0ZSA+PSAnQScgJiYgY2FuZGlkYXRlIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAoY2FuZGlkYXRlID49ICcwJyAmJiBjYW5kaWRhdGUgPD0gJzknKSkgeworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgmY2FuZGlkYXRlLCAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdHVzX3QgcmVwb3J0RHJtUGx1Z2luTWV0cmljcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlcmlhbGl6ZWRNZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiB2ZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGRlc2NyaXB0aW9uKSB7CisgICAgTWV0cmljc0dyb3VwIHJvb3RfbWV0cmljc19ncm91cDsKKyAgICBpZiAoIXJvb3RfbWV0cmljc19ncm91cC5QYXJzZUZyb21BcnJheShzZXJpYWxpemVkTWV0cmljcy5hcnJheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWx1cmUgdG8gcGFyc2UuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJkcm0udmVuZG9yLiVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FuaXRpemUodmVuZG9yKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZShkZXNjcmlwdGlvbikuY19zdHIoKSk7CisKKyAgICByZXR1cm4gcmVwb3J0TWV0cmljc0dyb3VwKHJvb3RfbWV0cmljc19ncm91cCwgbmFtZSwgTlVMTCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ2NTkzLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElDYXMgewotICAgIHZvaWQgc2V0UHJpdmF0ZURhdGEoaW4gYnl0ZVtdIHB2dERhdGEpOwotICAgIGJ5dGVbXSBvcGVuU2Vzc2lvbigpOwotICAgIHZvaWQgY2xvc2VTZXNzaW9uKGluIGJ5dGVbXSBzZXNzaW9uSWQpOwotICAgIHZvaWQgc2V0U2Vzc2lvblByaXZhdGVEYXRhKGluIGJ5dGVbXSBzZXNzaW9uSWQsIGluIGJ5dGVbXSBwdnREYXRhKTsKLSAgICB2b2lkIHByb2Nlc3NFY20oaW4gYnl0ZVtdIHNlc3Npb25JZCwgaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZWNtKTsKLSAgICB2b2lkIHByb2Nlc3NFbW0oaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZW1tKTsKLSAgICB2b2lkIHNlbmRFdmVudChpbnQgZXZlbnQsIGludCBhcmcsIGluIEBudWxsYWJsZSBieXRlW10gZXZlbnREYXRhKTsKLSAgICB2b2lkIHByb3Zpc2lvbihTdHJpbmcgcHJvdmlzaW9uU3RyaW5nKTsKLSAgICB2b2lkIHJlZnJlc2hFbnRpdGxlbWVudHMoaW50IHJlZnJlc2hUeXBlLCBpbiBAbnVsbGFibGUgYnl0ZVtdIHJlZnJlc2hEYXRhKTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhNWFiYy4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSUNhc0xpc3RlbmVyIHsKLSAgICB2b2lkIG9uRXZlbnQoaW50IGV2ZW50LCBpbnQgYXJnLCBpbiBAbnVsbGFibGUgYnl0ZVtdIGRhdGEpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjY4MjUuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5JRGVzY3JhbWJsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5JQ2FzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuSUNhc0xpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElNZWRpYUNhc1NlcnZpY2UgewotICAgIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yW10gZW51bWVyYXRlUGx1Z2lucygpOwotICAgIGJvb2xlYW4gaXNTeXN0ZW1JZFN1cHBvcnRlZChpbnQgQ0Ffc3lzdGVtX2lkKTsKLSAgICBJQ2FzIGNyZWF0ZVBsdWdpbihpbnQgQ0Ffc3lzdGVtX2lkLCBJQ2FzTGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIGJvb2xlYW4gaXNEZXNjcmFtYmxlclN1cHBvcnRlZChpbnQgQ0Ffc3lzdGVtX2lkKTsKLSAgICBJRGVzY3JhbWJsZXIgY3JlYXRlRGVzY3JhbWJsZXIoaW50IENBX3N5c3RlbV9pZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4ZDBjNi4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFDYXMuUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IgY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmFtYmxlci5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODkyNDQuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFEZXNjcmFtYmxlci5EZXNjcmFtYmxlSW5mbyBjcHBfaGVhZGVyICJtZWRpYS9NZWRpYUNhc0RlZnMuaCI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Byb3Rvcy9wbHVnaW5fbWV0cmljcy5wcm90byBiL2RybS9saWJtZWRpYWRybS9wcm90b3MvcGx1Z2luX21ldHJpY3MucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyNmYxNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9wcm90b3MvcGx1Z2luX21ldHJpY3MucHJvdG8KQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuZHJtX21ldHJpY3M7CisKKy8vIG5lZWQgdGhpcyBpZiB3ZSBhcmUgdXNpbmcgbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKKy8vIFRoZSBNZXRyaWNzR3JvdXAgaXMgYSBjb2xsZWN0aW9uIG9mIG1ldHJpYyBuYW1lL3ZhbHVlIHBhaXIgaW5zdGFuY2VzCisvLyB0aGF0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBwcm92aWRlZCB0byBhIGNhbGxlci4KK21lc3NhZ2UgTWV0cmljc0dyb3VwIHsKKyAgbWVzc2FnZSBNZXRyaWMgeworICAgIG1lc3NhZ2UgTWV0cmljVmFsdWUgeworICAgICAgLy8gRXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBiZSBzZXQuCisgICAgICBvcHRpb25hbCBpbnQ2NCBpbnRfdmFsdWUgPSAxOworICAgICAgb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDI7CisgICAgICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nX3ZhbHVlID0gMzsKKyAgICB9CisKKyAgICAvLyBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLiBNdXN0IGJlIHZhbGlkIFVURi04LiBSZXF1aXJlZC4KKyAgICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisKKyAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIG1ldHJpYy4gUmVxdWlyZWQuCisgICAgb3B0aW9uYWwgTWV0cmljVmFsdWUgdmFsdWUgPSAyOworICB9CisKKyAgLy8gVGhlIGxpc3Qgb2YgbmFtZS92YWx1ZSBwYWlycyBvZiBtZXRyaWNzLgorICByZXBlYXRlZCBNZXRyaWMgbWV0cmljID0gMTsKKworICAvLyBBbGxvdyBtdWx0aXBsZSBzdWIgZ3JvdXBzIG9mIG1ldHJpY3MuCisgIHJlcGVhdGVkIE1ldHJpY3NHcm91cCBtZXRyaWNfc3ViX2dyb3VwID0gMjsKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCmluZGV4IDhmZDg2NmMuLjRiMTM5YTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tawpAQCAtMjgsOCArMjgsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGliY2xlYXJrZXljYXNwbHVnaW4KIAotI1RPRE86IG1vdmUgdGhpcyBiYWNrIHRvIC92ZW5kb3IvbGliIGFmdGVyIGNvbnZlcnNpb24gdG8gdHJlYmxlCi0jTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWNhcwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKQEAgLTM5LDYgKzM4LDkgQEAKICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICBsaWJwcm90b2J1Zi1jcHAtbGl0ZSBcCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIG1lZGlhX3BsdWdpbl9oZWFkZXJzCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmpzbW4gXAogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKaW5kZXggNGVkNWZjZS4uZTI3NjMxZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KIAogICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uSWQpOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICBzcDxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPQogICAgICAgICAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUtleUZldGNoZXJMb2NrKTsKQEAgLTI5Myw3ICsyOTMsNyBAQAogc3RhdHVzX3QgQ2xlYXJLZXlDYXNTZXNzaW9uOjp1cGRhdGVFQ00oCiAgICAgICAgIEtleUZldGNoZXIgKmtleUZldGNoZXIsIHZvaWQgKmVjbSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAoa2V5RmV0Y2hlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PVF9QUk9WSVNJT05FRDsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA8IGtFY21IZWFkZXJMZW5ndGgpIHsKQEAgLTM0NCw3ICszNDQsNyBAQAogICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgY29uc3QgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKICAgICAgICAgY29uc3Qgdm9pZCAqc3JjUHRyLCB2b2lkICpkc3RQdHIsIEFTdHJpbmcgKiAvKiBlcnJvckRldGFpbE1zZyAqLykgewogICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0NBTk5PVF9IQU5ETEU7CiAgICAgfQogCiAgICAgQUVTX0tFWSBjb250ZW50S2V5OwpAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgICAgIGludDMyX3Qga2V5SW5kZXggPSAoc2NyYW1ibGluZ0NvbnRyb2wgJiAxKTsKICAgICAgICAgaWYgKCFtS2V5SW5mb1trZXlJbmRleF0udmFsaWQpIHsKICAgICAgICAgICAgIEFMT0dFKCJkZWNyeXB0OiBrZXkgJWQgaXMgaW52YWxpZCIsIGtleUluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVDUllQVDsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9DQVNfREVDUllQVDsKICAgICAgICAgfQogICAgICAgICBjb250ZW50S2V5ID0gbUtleUluZm9ba2V5SW5kZXhdLmNvbnRlbnRLZXk7CiAgICAgfQpAQCAtNDIwLDcgKzQyMCw3IEBACiAKICAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJDbGVhcktleURlc2NyYW1ibGVyUGx1Z2luOiBzZXNzaW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgbUNBU1Nlc3Npb24gPSBzZXNzaW9uOwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKICAgICBpZiAobUNBU1Nlc3Npb24gPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5pbml0aWFsaXplZCBDQVMgc2Vzc2lvbiEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQ7CiAgICAgfQogCiAgICAgcmV0dXJuIG1DQVNTZXNzaW9uLT5kZWNyeXB0KApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKaW5kZXggOWNkNzdlOS4uNmUxMDA0YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCkBAIC00OCwyNCArNDgsMjQgQEAKICAqIEV4dHJhY3QgYSBjbGVhciBrZXkgYXNzZXQgZnJvbSBhIEpTT04gc3RyaW5nLgogICoKICAqIFJldHVybnMgT0sgaWYgYSBjbGVhciBrZXkgYXNzZXQgaXMgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSwKLSAqIG9yIEVSUk9SX0RSTV9OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKKyAqIG9yIEVSUk9SX0NBU19OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKICAqIGNsZWFyIGtleSBhc3NldC4KICAqLwogc3RhdHVzX3QgSnNvbkFzc2V0TG9hZGVyOjpleHRyYWN0QXNzZXRGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBTdHJpbmc4JiBqc29uQXNzZXRTdHJpbmcsIEFzc2V0ICphc3NldCkgewogICAgIGlmICghcGFyc2VKc29uQXNzZXRTdHJpbmcoanNvbkFzc2V0U3RyaW5nLCAmbUpzb25PYmplY3RzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfTk9fTElDRU5TRTsKICAgICB9CiAKICAgICBpZiAobUpzb25PYmplY3RzLnNpemUoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PX0xJQ0VOU0U7CiAgICAgfQogCiAgICAgaWYgKCFwYXJzZUpzb25PYmplY3QobUpzb25PYmplY3RzWzBdLCAmbVRva2VucykpCi0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogCiAgICAgaWYgKCFmaW5kS2V5KG1Kc29uT2JqZWN0c1swXSwgYXNzZXQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmgKaW5kZXggMmVmMDZjNC4uNWZiZGVhNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuaApAQCAtMjksNyArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNsZWFya2V5Y2FzIHsKIGVudW0gewotICAgIENMRUFSS0VZX1NUQVRVU19CQVNFID0gRVJST1JfRFJNX1ZFTkRPUl9NQVgsCisgICAgQ0xFQVJLRVlfU1RBVFVTX0JBU0UgPSBFUlJPUl9DQVNfVkVORE9SX01BWCwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJREFTU0VUSUQgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDEsCiAgICAgQ0xFQVJLRVlfU1RBVFVTX0lOVkFMSURTWVNURU1JRCA9IENMRUFSS0VZX1NUQVRVU19CQVNFIC0gMiwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDMsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawppbmRleCBjYmY3YmU3Li5lMTU0NWFmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTIxLDEyICsyMSwxMyBAQAogICAgIENsZWFyS2V5RmV0Y2hlclRlc3QuY3BwCiAKIExPQ0FMX01PRFVMRSA6PSBDbGVhcktleUZldGNoZXJUZXN0CitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIAogIyBMT0NBTF9MREZMQUdTIGlzIG5lZWRlZCBoZXJlIGZvciB0aGUgdGVzdCB0byB1c2UgdGhlIHBsdWdpbiwgYmVjYXVzZQogIyB0aGUgcGx1Z2luIGlzIG5vdCBpbiBzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiBXaXRob3V0IHRoaXMgLnNvCiAjIGxvYWRpbmcgZmFpbHMgYXQgcnVuLXRpbWUgKGxpbmtpbmcgaXMgb2theSkuCiBMT0NBTF9MREZMQUdTIDo9IFwKLSAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vbGliL21lZGlhY2FzIC1XbCwtLWVuYWJsZS1uZXctZHRhZ3MKKyAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vdmVuZG9yL2xpYi9tZWRpYWNhcyAtV2wsLS1lbmFibGUtbmV3LWR0YWdzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYnV0aWxzIGxpYmNsZWFya2V5Y2FzcGx1Z2luIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlicHJvdG9idWYtY3BwLWxpdGUgbGlibG9nCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKaW5kZXggYTk3ZmFjNi4uYTFkNjFkYSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5tawpAQCAtMjgsNiArMjgsOCBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlidXRpbHMgbGlibG9nCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbWVkaWFfcGx1Z2luX2hlYWRlcnMKKwogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEgXApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYWM1N2Q2NS4uMGZjZmM2NCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zNCw0ICszNCw1IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCiB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKaW5kZXggN2Y0NDgxOS4uYWJkMTg4NCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icApAQCAtMjIsNiArMjIsOCBAQAogICAgIHZlbmRvcjogdHJ1ZSwKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJtZWRpYWRybSIsCiAKKyAgICBoZWFkZXJfbGliczogWyJtZWRpYV9wbHVnaW5faGVhZGVycyJdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL09XTkVSUyBiL2luY2x1ZGUvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjZkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL09XTkVSUwpAQCAtMCwwICsxLDYgQEAKK2VsYXVyZW50QGdvb2dsZS5jb20KK2drYXN0ZW5AYW5kcm9pZC5jb20KK2h1bmdhQGdvb2dsZS5jb20KK2p0aW5rZXJAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGEwNTMwZTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApzaW1pbGFyaXR5IGluZGV4IDYxJQpyZW5hbWUgZnJvbSBkcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKaW5kZXggZmRmOTllYi4uOWVmZDc2ZCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKQEAgLTE0LDE0ICsxNCwyNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURlc2NyYW1ibGVyOworI2lmbmRlZiBBTkRST0lEX0FVRElPX0NMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKIAotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSURlc2NyYW1ibGVyIHsKLSAgICB2b2lkIHNldE1lZGlhQ2FzU2Vzc2lvbihpbiBieXRlW10gc2Vzc2lvbklkKTsKLSAgICBib29sZWFuIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChTdHJpbmcgbWltZSk7Ci0gICAgaW50IGRlc2NyYW1ibGUoaW4gTWVkaWFEZXNjcmFtYmxlci5EZXNjcmFtYmxlSW5mbyBkZXNjcmFtYmxlSW5mbyk7Ci0gICAgdm9pZCByZWxlYXNlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9DbGllbnQgeworIHB1YmxpYzoKKyAgICBBdWRpb0NsaWVudCgpIDoKKyAgICAgICAgY2xpZW50VWlkKC0xKSwgY2xpZW50UGlkKC0xKSwgcGFja2FnZU5hbWUoIiIpIHt9CisKKyAgICB1aWRfdCBjbGllbnRVaWQ7CisgICAgcGlkX3QgY2xpZW50UGlkOworICAgIFN0cmluZzE2IHBhY2thZ2VOYW1lOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKaW5kZXggNTBlMTJmNC4uNzcxZjFiOCAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKaW5kZXggMzA5YzIzZC4uY2UzMGE3OCAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0Nhc0ltcGwuaCBiL2luY2x1ZGUvbWVkaWEvQ2FzSW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjZmMWNlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQ2FzSW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ0FTX0lNUExfSF8KLSNkZWZpbmUgQ0FTX0lNUExfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQ2FzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzTGlzdGVuZXI7Ci19Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7Ci11c2luZyBuYW1lc3BhY2UgTWVkaWFDYXM7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXN0cnVjdCBDYXNQbHVnaW47Ci1jbGFzcyBTaGFyZWRMaWJyYXJ5OwotCi1jbGFzcyBDYXNJbXBsIDogcHVibGljIEJuQ2FzIHsKLXB1YmxpYzoKLSAgICBDYXNJbXBsKGNvbnN0IHNwPElDYXNMaXN0ZW5lcj4gJmxpc3RlbmVyKTsKLSAgICB2aXJ0dWFsIH5DYXNJbXBsKCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBPbkV2ZW50KAotICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKLSAgICAgICAgICAgIGludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICBpbnQzMl90IGFyZywKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIGluaXQoY29uc3Qgc3A8U2hhcmVkTGlicmFyeT4mIGxpYnJhcnksIENhc1BsdWdpbiAqcGx1Z2luKTsKLSAgICB2b2lkIG9uRXZlbnQoCi0gICAgICAgICAgICBpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgaW50MzJfdCBhcmcsCi0gICAgICAgICAgICB1aW50OF90ICpkYXRhLAotICAgICAgICAgICAgc2l6ZV90IHNpemUpOwotCi0gICAgLy8gSUNhcyBpbmhlcml0cwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2V0UHJpdmF0ZURhdGEoCi0gICAgICAgICAgICBjb25zdCBDYXNEYXRhJiBwdnREYXRhKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIG9wZW5TZXNzaW9uKENhc1Nlc3Npb25JZCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNsb3NlU2Vzc2lvbihjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBzZXRTZXNzaW9uUHJpdmF0ZURhdGEoCi0gICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcHJvY2Vzc0VjbSgKLSAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkLCBjb25zdCBQYXJjZWxhYmxlQ2FzRGF0YSYgZWNtKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHByb2Nlc3NFbW0oY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVtbSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBzZW5kRXZlbnQoCi0gICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gJmV2ZW50RGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBwcm92aXNpb24oY29uc3QgU3RyaW5nMTYmIHByb3Zpc2lvblN0cmluZykgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyByZWZyZXNoRW50aXRsZW1lbnRzKAotICAgICAgICAgICAgaW50MzJfdCByZWZyZXNoVHlwZSwgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gJnJlZnJlc2hEYXRhKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlbGVhc2UoKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgUGx1Z2luSG9sZGVyOwotICAgIHNwPFNoYXJlZExpYnJhcnk+IG1MaWJyYXJ5OwotICAgIHNwPFBsdWdpbkhvbGRlcj4gbVBsdWdpbkhvbGRlcjsKLSAgICBzcDxJQ2FzTGlzdGVuZXI+IG1MaXN0ZW5lcjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhc0ltcGwpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQ0FTX0lNUExfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRGVzY3JhbWJsZXJJbXBsLmggYi9pbmNsdWRlL21lZGlhL0Rlc2NyYW1ibGVySW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjIxMmFjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRGVzY3JhbWJsZXJJbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBERVNDUkFNQkxFUl9JTVBMX0hfCi0jZGVmaW5lIERFU0NSQU1CTEVSX0lNUExfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuRGVzY3JhbWJsZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwotdXNpbmcgbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXI7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXN0cnVjdCBEZXNjcmFtYmxlclBsdWdpbjsKLWNsYXNzIFNoYXJlZExpYnJhcnk7Ci0KLWNsYXNzIERlc2NyYW1ibGVySW1wbCA6IHB1YmxpYyBCbkRlc2NyYW1ibGVyIHsKLXB1YmxpYzoKLSAgICBEZXNjcmFtYmxlckltcGwoY29uc3Qgc3A8U2hhcmVkTGlicmFyeT4mIGxpYnJhcnksIERlc2NyYW1ibGVyUGx1Z2luICpwbHVnaW4pOwotICAgIHZpcnR1YWwgfkRlc2NyYW1ibGVySW1wbCgpOwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2V0TWVkaWFDYXNTZXNzaW9uKAotICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG1pbWUsIGJvb2wgKnJlc3VsdCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBkZXNjcmFtYmxlKAotICAgICAgICAgICAgY29uc3QgRGVzY3JhbWJsZUluZm8mIGRlc2NyYW1ibGVJbmZvLCBpbnQzMl90ICpyZXN1bHQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcmVsZWFzZSgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIHNwPFNoYXJlZExpYnJhcnk+IG1MaWJyYXJ5OwotICAgIERlc2NyYW1ibGVyUGx1Z2luICptUGx1Z2luOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVzY3JhbWJsZXJJbXBsKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIERFU0NSQU1CTEVSX0lNUExfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFDYXNEZWZzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhQ2FzRGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzVhOTY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFDYXNEZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9DQVNfREVGU19IXwotI2RlZmluZSBNRURJQV9DQVNfREVGU19IXwotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9DYXNBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvRGVzY3JhbWJsZXJBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLWNsYXNzIElNZW1vcnk7Ci1uYW1lc3BhY2UgbWVkaWEgewotCi1uYW1lc3BhY2UgTWVkaWFDYXMgewotY2xhc3MgUGFyY2VsYWJsZUNhc0RhdGEgOiBwdWJsaWMgQ2FzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFBhcmNlbGFibGUgewotcHVibGljOgotICAgIFBhcmNlbGFibGVDYXNEYXRhKCkge30KLSAgICBQYXJjZWxhYmxlQ2FzRGF0YShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgOgotICAgICAgICBDYXNEYXRhKGRhdGEsIGRhdGEgKyBzaXplKSB7fQotICAgIHZpcnR1YWwgflBhcmNlbGFibGVDYXNEYXRhKCkge30KLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyY2VsYWJsZUNhc0RhdGEpOwotfTsKLQotY2xhc3MgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IgOiBwdWJsaWMgUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gICAgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoaW50MzJfdCBDQV9zeXN0ZW1faWQsIGNvbnN0IGNoYXIgKm5hbWUpCi0gICAgICAgIDogbUNBU3lzdGVtSWQoQ0Ffc3lzdGVtX2lkKSwgbU5hbWUobmFtZSkge30KLQotICAgIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKCkgOiBtQ0FTeXN0ZW1JZCgwKSB7fQotCi0gICAgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3ImJiBkZXNjKSA9IGRlZmF1bHQ7Ci0KLSAgICB2aXJ0dWFsIH5QYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcigpIHt9Ci0KLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgaW50MzJfdCBtQ0FTeXN0ZW1JZDsKLSAgICBTdHJpbmcxNiBtTmFtZTsKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcik7Ci19OwotfQotCi1uYW1lc3BhY2UgTWVkaWFEZXNjcmFtYmxlciB7Ci1jbGFzcyBEZXNjcmFtYmxlSW5mbyA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKLXB1YmxpYzoKLSAgICBlbnVtIERlc3RpbmF0aW9uVHlwZSB7Ci0gICAgICAgIGtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIsICAgIC8vIG5vbi1zZWN1cmUKLSAgICAgICAga0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZSAgLy8gc2VjdXJlCi0gICAgfTsKLQotICAgIERlc3RpbmF0aW9uVHlwZSBkc3RUeXBlOwotICAgIERlc2NyYW1ibGVyUGx1Z2luOjpTY3JhbWJsaW5nQ29udHJvbCBzY3JhbWJsaW5nQ29udHJvbDsKLSAgICBzaXplX3QgbnVtU3ViU2FtcGxlczsKLSAgICBEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzOwotICAgIHNwPElNZW1vcnk+IHNyY01lbTsKLSAgICBpbnQzMl90IHNyY09mZnNldDsKLSAgICB2b2lkICpkc3RQdHI7Ci0gICAgaW50MzJfdCBkc3RPZmZzZXQ7Ci0KLSAgICBEZXNjcmFtYmxlSW5mbygpOwotICAgIHZpcnR1YWwgfkRlc2NyYW1ibGVJbmZvKCk7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi1wcml2YXRlOgotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVzY3JhbWJsZUluZm8pOwotfTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX0RFRlNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oIGIvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uN2Q5YTdhMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbCBiL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwKaW5kZXggMzdlMmMzOS4uZjQwMDU4MiAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbAorKysgYi9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvIGIvaW5jbHVkZS9tZWRpYS9uYmFpbwpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNjdkMGJhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTU4NDFlNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mNWJjYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40M2JmYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjhhMTNiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yNzUwZmRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGVhNDNiZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zMGY0MjZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZmNmExNTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL05CQUlPLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzM1NDAxZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdhY2ZjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTRiYmJjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42NGIyMWNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjc0YTNiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IDlkYTVlZjMuLmZmNDQwYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtNTY4LDYgKzU2OCw5IEBACiAgICAgLy8gd2hpY2ggbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOwogCisgICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgdXNlZCBieSBkdW1wKCkgLSB0aGlzIGhhcyBubyBzaWRlIGVmZmVjdHMuCisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdDsKKwogICAgIC8vIEN1cnJlbnRseSBBdWRpb0ZsaW5nZXIgd2lsbCBjYWxsIGZyYW1lc1JlYWR5KCkgZm9yIGEgZmFzdCB0cmFjayBmcm9tIHR3byB0aHJlYWRzOgogICAgIC8vIEZhc3RNaXhlciB0aHJlYWQsIGFuZCBub3JtYWwgbWl4ZXIgdGhyZWFkLiAgVGhpcyBpcyBkYW5nZXJvdXMsIGFzIHRoZSBwcm94eSBpcyBpbnRlbmRlZAogICAgIC8vIHRvIGJlIGNhbGxlZCBmcm9tIGF0IG1vc3Qgb25lIHRocmVhZCBvZiBzZXJ2ZXIsIGFuZCBvbmUgdGhyZWFkIG9mIGNsaWVudC4KQEAgLTYyMCw2ICs2MjMsNyBAQAogCiBwdWJsaWM6CiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOworICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBmcmFtZXNSZWFkeUlzQ2FsbGVkQnlNdWx0aXBsZVRocmVhZHMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc3ZjhmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElSYWRpbyA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0KLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJhZGlvKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpbzogcHVibGljIEJuSW50ZXJmYWNlPElSYWRpbz4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpb0NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYyYWQ2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVJhZGlvQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLQotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmFkaW9DbGllbnQpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KSA9IDA7Ci0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpb0NsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW9DbGllbnQ+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW9TZXJ2aWNlLmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NmRkNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19TRVJWSUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJUmFkaW87Ci1jbGFzcyBJUmFkaW9DbGllbnQ7Ci0KLWNsYXNzIElSYWRpb1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShSYWRpb1NlcnZpY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCByYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuUmFkaW9TZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVJhZGlvU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9SYWRpby5oIGIvaW5jbHVkZS9yYWRpby9SYWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRkZDJmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vUmFkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHJhZGlvL1JhZGlvQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVtb3J5RGVhbGVyOwotCi1jbGFzcyBSYWRpbyA6IHB1YmxpYyBCblJhZGlvQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci17Ci1wdWJsaWM6Ci0KLSAgICB2aXJ0dWFsIH5SYWRpbygpOwotCi0gICAgc3RhdGljICBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKLSAgICBzdGF0aWMgIHNwPFJhZGlvPiBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+JiBjYWxsYmFjayk7Ci0KLQotICAgICAgICAgICAgdm9pZCBkZXRhY2goKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGNhbmNlbCgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCk7Ci0KLSAgICAgICAgICAgIC8vIEJwUmFkaW9DbGllbnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7Ci0KLSAgICAgICAgICAgIC8vSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotCi1wcml2YXRlOgotICAgICAgICAgICAgUmFkaW8ocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+Jik7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gZ2V0UmFkaW9TZXJ2aWNlKCk7Ci0KLSAgICAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgICAgICAgICAgc3A8SVJhZGlvPiAgICAgICAgICAgICAgbUlSYWRpbzsKLSAgICAgICAgICAgIHNwPFJhZGlvQ2FsbGJhY2s+ICAgICAgIG1DYWxsYmFjazsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfUkFESU9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9SYWRpb0NhbGxiYWNrLmggYi9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3ZjFhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0NBTExCQUNLX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0NhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLQotICAgICAgICAgICAgUmFkaW9DYWxsYmFjaygpIHt9Ci0gICAgdmlydHVhbCB+UmFkaW9DYWxsYmFjaygpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50KSA9IDA7Ci0KLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSApkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDVlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9PV05FUlMKQEAgLTAsMCArMSwxOCBAQAorY2h6QGdvb2dsZS5jb20KK2R3a2FuZ0Bnb29nbGUuY29tCitlbGF1cmVudEBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQoraHVuZ2FAZ29vZ2xlLmNvbQoram10cml2aUBnb29nbGUuY29tCitrcm9jYXJkQGdvb2dsZS5jb20KK2xham9zQGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQorcGhpbGJ1cmtAZ29vZ2xlLmNvbQorcG1jbGVhbkBnb29nbGUuY29tCityYWNoYWRAZ29vZ2xlLmNvbQorcmFnb0Bnb29nbGUuY29tCityb2JlcnRzaGloQGdvb2dsZS5jb20KK3dqaWFAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IGFmZDExODkuLjNlZTc0OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMTQsNyArMTQsNiBAQAogCWxpYmxvZyBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJuYmFpbyBcCi0JbGlicmFkaW9zZXJ2aWNlIFwKIAlsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIFwKIAlsaWJ1dGlscyBcCiAJbGliaHdiaW5kZXIKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggZWUwMmQyMy4uMzRjNjI5YiAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiTWVkaWFMb2dTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiUmFkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpAQCAtMTMzLDcgKzEzMiw2IEBACiAgICAgICAgIEF1ZGlvRmxpbmdlcjo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBBQXVkaW9TZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwotICAgICAgICBSYWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCmluZGV4IGY1MzliYTkuLjZlNjBmMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCkBAIC0xNiwxMiArMTYsMTQgQEAKICAgICBuYW1lOiAibGliQUF1ZGlvX2hlYWRlcnMiLAogICAgIGZyb206ICJpbmNsdWRlIiwKICAgICB0bzogIiIsCi0gICAgc3JjczogWyJpbmNsdWRlL2FhdWRpby8qLmgiXSwKKyAgICAvLyBvbWl0IEFBdWRpb1Rlc3RpbmcuaDsgc3VwcGxpZWQgc2VwYXJhdGVseSB0byB0aG9zZSB3aG8gbmVlZCBpdAorICAgIHNyY3M6IFsiaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgiXSwKICAgICBsaWNlbnNlOiAiaW5jbHVkZS9hYXVkaW8vTk9USUNFIiwKIH0KIAogbmRrX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJhYXVkaW8iLAorICAgIC8vIGRlbGliZXJhdGVseSBpbmNsdWRlcyBzeW1ib2xzIGZyb20gQUF1ZGlvVGVzdGluZy5oCiAgICAgc3ltYm9sX2ZpbGU6ICJsaWJhYXVkaW8ubWFwLnR4dCIsCiAgICAgZmlyc3RfdmVyc2lvbjogIjI2IiwKICAgICB1bnZlcnNpb25lZF91bnRpbDogImN1cnJlbnQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL09XTkVSUyBiL21lZGlhL2xpYmFhdWRpby9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNTFmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9PV05FUlMKQEAgLTAsMCArMSBAQAorcGhpbGJ1cmtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCmluZGV4IDkxMGIxMGMuLmVkZjY0NGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBkZXZpY2VJZCA9IEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiZGV2aWNlSWQgPSAlZFxuIiwgZGV2aWNlSWQpOwogCi0gICAgYWN0dWFsU2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShhYXVkaW9TdHJlYW0pOworICAgIGFjdHVhbFNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoYWF1ZGlvU3RyZWFtKTsKICAgICBwcmludGYoIlNhbXBsZXNQZXJGcmFtZSA9ICVkXG4iLCBhY3R1YWxTYW1wbGVzUGVyRnJhbWUpOwogICAgIGFjdHVhbFNhbXBsZVJhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiU2FtcGxlc1BlckZyYW1lID0gJWRcbiIsIGFjdHVhbFNhbXBsZVJhdGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaAppbmRleCA1ZWNhYzA0Li4xMzQ0MjczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaApAQCAtNzcsNyArNzcsNyBAQAogICAgICAgICBpZiAobVN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQobVN0cmVhbSk7CisgICAgICAgIHJldHVybiBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1TdHJlYW0pOzsKICAgICB9CiAKICAgICAvKioKQEAgLTE4Nyw3ICsxODcsNyBAQAogCiAgICAgLy8gV3JpdGUgemVybyBkYXRhIHRvIGZpbGwgdXAgdGhlIGJ1ZmZlciBhbmQgcHJldmVudCB1bmRlcnJ1bnMuCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHByaW1lKCkgewotICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUobVN0cmVhbSk7CisgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChtU3RyZWFtKTsKICAgICAgICAgY29uc3QgaW50IG51bUZyYW1lcyA9IDMyOyAvLyBhcmJpdHJhcnkKICAgICAgICAgZmxvYXQgemVyb3NbbnVtRnJhbWVzICogc2FtcGxlc1BlckZyYW1lXTsKICAgICAgICAgbWVtc2V0KHplcm9zLCAwLCBzaXplb2YoemVyb3MpKTsKQEAgLTI2MCw3ICsyNjAsNyBAQAogICAgIH0KICAgICBQZWFrVHJhY2tlckRhdGFfdCAqZGF0YSA9IChQZWFrVHJhY2tlckRhdGFfdCAqKSB1c2VyRGF0YTsKICAgICAvLyBwcmludGYoIk15Q2FsbGJhY2tQcm9jKCk6IGZyYW1lQ291bnQgPSAlZFxuIiwgbnVtRnJhbWVzKTsKLSAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoc3RyZWFtKTsKKyAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoc3RyZWFtKTsKICAgICBmbG9hdCBzYW1wbGU7CiAgICAgLy8gVGhpcyBjb2RlIGFzc3VtZSBtb25vIG9yIHN0ZXJlby4KICAgICBzd2l0Y2ggKEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoc3RyZWFtKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCmluZGV4IGUxODg2YWMuLjMwZmJkZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKQEAgLTIzNCwxNCArMjM0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KTsKIAogLyoqCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KCkKLSAqLwotLy8gVE9ETyByZW1vdmUgYXMgc29vbiBhcyB0aGUgTkRLIGFuZCBPUyBhcmUgaW4gc3luYywgYmVmb3JlIFJDMQotQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpOwotCi0vKioKICAqIFJlcXVlc3QgYSBzYW1wbGUgZGF0YSBmb3JtYXQsIGZvciBleGFtcGxlIEFBVURJT19GT1JNQVRfUENNX0kxNi4KICAqCiAgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19VTlNQRUNJRklFRC4KQEAgLTcyOSwxNSArNzIxLDYgQEAKIEFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKIAogLyoqCi0gKiBUaGUgc2FtcGxlc1BlckZyYW1lIGlzIGFsc28ga25vd24gYXMgY2hhbm5lbENvdW50LgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KCkKLSAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIGFjdHVhbCBzYW1wbGVzIHBlciBmcmFtZQotICovCi1BQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW0qIHN0cmVhbSk7Ci0KLS8qKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gYWN0dWFsIGRldmljZSBJRAogICovCkBAIC04MTAsNyArNzkzLDcgQEAKICAqIFRoZSBwb3NpdGlvbiBhbmQgdGltZSBwYXNzZWQgYmFjayBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcGFyYW0gY2xvY2tpZCBBQVVESU9fQ0xPQ0tfTU9OT1RPTklDIG9yIEFBVURJT19DTE9DS19CT09UVElNRQorICogQHBhcmFtIGNsb2NraWQgQ0xPQ0tfTU9OT1RPTklDIG9yIENMT0NLX0JPT1RUSU1FCiAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBwb2ludGVyIHRvIGEgdmFyaWFibGUgdG8gcmVjZWl2ZSB0aGUgcG9zaXRpb24KICAqIEBwYXJhbSB0aW1lTmFub3NlY29uZHMgcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHJlY2VpdmUgdGhlIHRpbWUKICAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dCBiL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dAppbmRleCAyYmE1MjUwLi5iOTAxMmU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0CkBAIC0xMSw3ICsxMSw2IEBACiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudDsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdDsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlOwpAQCAtMzUsNyArMzQsNiBAQAogICAgIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzOwogICAgIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQ7CiAgICAgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGU7Ci0gICAgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZTsKICAgICBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50OwogICAgIEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGU7CiAgICAgQUF1ZGlvU3RyZWFtX2dldERldmljZUlkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKaW5kZXggNGQwYTdiOC4uYzA2YzhhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCkBAIC0yNSw3ICsyNSw2IEBACiAKICNkZWZpbmUgTUlOX0xBVEVORVNTX05BTk9TICgxMCAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAogSXNvY2hyb25vdXNDbG9ja01vZGVsOjpJc29jaHJvbm91c0Nsb2NrTW9kZWwoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggM2Y1ZGU3Ny4uY2E0MjQ0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0xNTAsMTMgKzE1MCw2IEBACiAgICAgc3RyZWFtQnVpbGRlci0+c2V0U2FtcGxlc1BlckZyYW1lKGNoYW5uZWxDb3VudCk7CiB9CiAKLUFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQotewotICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpOwotfQotCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCiB7CkBAIC0zNTcsMTIgKzM1MCw2IEBACiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKIH0KIAotQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCi17Ci0gICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmdldFNhbXBsZXNQZXJGcmFtZSgpOwotfQotCiBBQVVESU9fQVBJIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCAyZjcxMGJkLi4yMTFiZDdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC0xMjk3LDcgKzEyOTcsNyBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKQEAgLTEzMDcsNyArMTMwNyw3IEBACiAgICAgfQogCiAgICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgY2IoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IGIwYjAxZGIuLjMxZTFlMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgpAQCAtNjIsMTEgKzYzLDYgQEAKICAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBjb252ZXJ0VGltZXNwZWNUb05zKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpCi17Ci0gICAgcmV0dXJuIHR2LnR2X3NlYyAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCArIHR2LnR2X25zZWM7Ci19Ci0KIC8vIGN1cnJlbnQgbW9ub3RvbmljIHRpbWUgaW4gbWljcm9zZWNvbmRzLgogc3RhdGljIGludDY0X3QgZ2V0Tm93VXMoKQogewpAQCAtMjU2Myw3ICsyNTU5LDcgQEAKICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIHRpbWVzdGFtcCB0aW1lIGV2ZW4gd2hlbiBwYXVzZWQuCiAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQgLyogbm90IG5lZWRlZDogU1RBVEVfUEFVU0VEX1NUT1BQSU5HICovKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZXN0YW1wLm1UaW1lKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWcgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldHMubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPCAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0cy5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxfTEFTVEtFUk5FTE9LXSA8IDApCkBAIC0yNjk1LDggKzI2OTEsOSBAQAogICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIGNhdXNlZCBieSBlcnJhdGljIHJlcG9ydHMgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgQUxTQSBkcml2ZXJzLgogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKHByZXZpb3VzVGltZXN0YW1wVmFsaWQpIHsKLSAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcHJldmlvdXNUaW1lTmFub3MgPSBjb252ZXJ0VGltZXNwZWNUb05zKG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZSk7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBjb252ZXJ0VGltZXNwZWNUb05zKHRpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHByZXZpb3VzVGltZU5hbm9zID0KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVOYW5vcyA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWVzdGFtcC5tVGltZSk7CiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IHByZXZpb3VzVGltZU5hbm9zKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpcHJldmlvdXNUaW1lTmFub3MpOwpAQCAtMjcyNiw3ICsyNzIzLDcgQEAKICNpZiAwCiAgICAgICAgICAgICAvLyBVbmNvbW1lbnQgdGhpcyB0byB2ZXJpZnkgYXVkaW8gdGltZXN0YW1wIHJhdGUuCiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUaW1lc3BlY1RvTnModGltZXN0YW1wLm1UaW1lKSAtIHByZXZpb3VzVGltZU5hbm9zOworICAgICAgICAgICAgICAgICAgICBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lc3RhbXAubVRpbWUpIC0gcHJldmlvdXNUaW1lTmFub3M7CiAgICAgICAgICAgICBpZiAoZGVsdGFUaW1lICE9IDApIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGNvbXB1dGVkU2FtcGxlUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uICogKGxvbmcgbG9uZylOQU5PU19QRVJfU0VDT05EIC8gZGVsdGFUaW1lOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCAyY2U2YzYzLi5lNDk5NDViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMzYsNyArMzYsNyBAQAogLy8gYSB2YWx1ZSBiZXR3ZWVuICJvdGhlciIgKyAxIGFuZCAib3RoZXIiICsgSU5UMzJfTUFYLCB0aGUgY2hvaWNlIG9mCiAvLyB3aGljaCBuZWVkcyB0byBiZSB0aGUgImxlYXN0IHJlY2VudGx5IHVzZWQiIHNlcXVlbmNlIHZhbHVlIGZvciAic2VsZiIuCiAvLyBJbiBnZW5lcmFsLCB0aGlzIG1lYW5zIChuZXdfc2VsZikgcmV0dXJuZWQgaXMgbWF4KHNlbGYsIG90aGVyKSArIDEuCi0KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogc3RhdGljIHVpbnQzMl90IGluY3JlbWVudFNlcXVlbmNlKHVpbnQzMl90IHNlbGYsIHVpbnQzMl90IG90aGVyKSB7CiAgICAgaW50MzJfdCBkaWZmID0gKGludDMyX3QpIHNlbGYgLSAoaW50MzJfdCkgb3RoZXI7CiAgICAgaWYgKGRpZmYgPj0gMCAmJiBkaWZmIDwgSU5UMzJfTUFYKSB7CkBAIC0zODksNiArMzg5LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBdWRpb1RyYWNrQ2xpZW50UHJveHk6OmZsdXNoKCkKIHsKICAgICAvLyBUaGlzIHdvcmtzIGZvciBtRnJhbWVDb3VudFAyIDw9IDJeMzAKQEAgLTgzMiw2ICs4MzMsMjUgQEAKICAgICByZXR1cm4gZmlsbGVkOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKK3NpemVfdCBBdWRpb1RyYWNrU2VydmVyUHJveHk6OmZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0Cit7CisgICAgaWYgKG1Jc1NodXRkb3duKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKKyAgICBjb25zdCBpbnQzMl90IGZsdXNoID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubUZsdXNoKTsKKyAgICBpZiAoZmx1c2ggIT0gbUZsdXNoKSB7CisgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKKyAgICB9CisgICAgY29uc3QgaW50MzJfdCByZWFyID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOworICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CisgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgeworICAgICAgICByZXR1cm4gMDsgLy8gZXJyb3IgY29uZGl0aW9uLCBzaWxlbnRseSByZXR1cm4gMC4KKyAgICB9CisgICAgcmV0dXJuIGZpbGxlZDsKK30KKwogYm9vbCAgQXVkaW9UcmFja1NlcnZlclByb3h5OjpzZXRTdHJlYW1FbmREb25lKCkgewogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGJvb2wgb2xkID0KQEAgLTg0Myw2ICs4NjMsNyBAQAogICAgIHJldHVybiBvbGQ7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBdWRpb1RyYWNrU2VydmVyUHJveHk6OnRhbGx5VW5kZXJydW5GcmFtZXModWludDMyX3QgZnJhbWVDb3VudCkKIHsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKQEAgLTkwMCw2ICs5MjEsMTEgQEAKICAgICByZXR1cm4gbUZyYW1lc1JlYWR5U2FmZTsKIH0KIAorc2l6ZV90IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6ZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUZyYW1lc1JlYWR5U2FmZTsKK30KKwogc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp1cGRhdGVTdGF0ZVdpdGhMb29wKAogICAgICAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgKmxvY2FsU3RhdGUsIGNvbnN0IFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSAmdXBkYXRlKSBjb25zdAogewpAQCAtOTkzLDYgKzEwMTksNyBAQAogICAgIHJldHVybiAoc3NpemVfdCkgbVN0YXRlLm1Qb3NpdGlvbjsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiBzdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCkKIHsKICAgICBpZiAobUlzU2h1dGRvd24pIHsKQEAgLTEwMzcsNiArMTA2NCw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpyZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKQogewogICAgIHNpemVfdCBzdGVwQ291bnQgPSBidWZmZXItPm1GcmFtZUNvdW50OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAppbmRleCA5OGEwNTIxLi5hZDdmMWRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApAQCAtNDgsNiArNDgsMTggQEAKICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNvbmZpZy0+Zm9ybWF0KTsKIH0KIAoraW5saW5lIHZvaWQgcmVhZFJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSwgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKKyAgICBjbGllbnRJbmZvLT51aWQgPSAodWlkX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgIGNsaWVudEluZm8tPnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOworICAgIGNsaWVudEluZm8tPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKK30KKworaW5saW5lIHZvaWQgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CisgICAgZGF0YS53cml0ZVVpbnQzMigodWludDMyX3QpIGNsaWVudEluZm8tPnVpZCk7CisgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5zZXNzaW9uKTsKKyAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNvdXJjZSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGNsYXNzIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+CiB7CkBAIC04MCwxNCArOTIsMTMgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1JWF9TVEFURV9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIAotICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzb3VyY2UpOworICAgICAgICB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGRhdGEsIGNsaWVudEluZm8pOwogICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGNsaWVudENvbmZpZyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgZGV2aWNlQ29uZmlnKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBhdGNoSGFuZGxlKTsKQEAgLTEyMywxNCArMTM0LDE0IEBACiAgICAgY2FzZSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgZXZlbnQgPSAoaW50KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgY2xpZW50SW5mbzsKICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnOwogICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWc7CisgICAgICAgICAgICByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgJmNsaWVudEluZm8pOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmNsaWVudENvbmZpZyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmZGV2aWNlQ29uZmlnKTsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsICZjbGllbnRDb25maWcsICZkZXZpY2VDb25maWcsCisgICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCAmZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyYjlmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2drYXN0ZW5AZ29vZ2xlLmNvbQoram10cml2aUBnb29nbGUuY29tCittbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggMmUzOWQyMy4uNGQ1YjMxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMzMsNyArMzMsNyBAQAogCiB0eXBlZGVmIHZvaWQgKCphdWRpb19lcnJvcl9jYWxsYmFjaykoc3RhdHVzX3QgZXJyKTsKIHR5cGVkZWYgdm9pZCAoKmR5bmFtaWNfcG9saWN5X2NhbGxiYWNrKShpbnQgZXZlbnQsIFN0cmluZzggcmVnSWQsIGludCB2YWwpOwotdHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgaW50IHNvdXJjZSwKK3R5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCkBAIC00NDAsOCArNDQwLDkgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKICAgICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaAppbmRleCBkOTRhZDAwLi5lMGQyNDk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaApAQCAtMjYsNiArMjYsMTYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHsKKyAgICB1aWRfdCB1aWQ7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHJlY29yZF9jbGllbnRfaW5mb190OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNsYXNzIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgSUludGVyZmFjZQogewogcHVibGljOgpAQCAtMzgsOCArNDgsOCBAQAogICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBtaXhpbmcgc3RhdGUgb2YgYSBzcGVjaWZpYyBtaXggaW4gYSBkeW5hbWljIGF1ZGlvIHBvbGljeQogICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24KLSAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5tawppbmRleCBlNTkyMTY5Li44Mjc5MDhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsKQEAgLTMsNiArMyw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGliY3V0aWxzICAgXAogICAgIGxpYmxvZyAgICAgIFwKICAgICBsaWJ1dGlscyAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCmluZGV4IDcxZmJkOTguLjQ5ZWY5OTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCkBAIC05OCw3ICs5OCw4IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpIHsKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgewogfQogCiBEZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKQEAgLTEyMCwyNCArMTIxLDIxIEBACiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBwcmltYXJ5RGV2ID0gSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKG1EZXZpY2UpOwotICAgIGlmIChwcmltYXJ5RGV2ID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBwcmltYXJ5RGV2LT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBwcmltYXJ5RGV2ID0gSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKG1EZXZpY2UpOwotICAgIGlmIChwcmltYXJ5RGV2ID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgcHJpbWFyeURldi0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gcHJpbWFyeURldi0+Z2V0TWFzdGVyVm9sdW1lKAorICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAogICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKQEAgLTE0OSw5ICsxNDcsOCBAQAogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgcHJpbWFyeURldi0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oCmluZGV4IDlkYTAyYTQuLjg2NTFiNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmgKQEAgLTE4LDExICsxOCwxMyBAQAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xMTAsNiArMTEyLDcgQEAKICAgcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwogICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7CisgICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgogCiAgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgogICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NmFiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2tyb2NhcmRAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcAppbmRleCA0Mjc4NWQ1Li4xNzZhYmVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtNDgsNiArNDgsMTggQEAKICAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCiAgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAogICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKKworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KIH0KIAogU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CkBAIC0xMzUsNiArMTQ3LDcgQEAKICAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwogfQogCkBAIC0zMTEsNyArMzI0LDcgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAogICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAogICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKICAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47CkBAIC0zMjAsNiArMzMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOwogICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKApAQCAtNTgwLDcgKzU5NSw3IEBACiAgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOwogICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OlJFQUQ7CiAgICAgcGFyYW1zLnBhcmFtcy5yZWFkID0gYnl0ZXM7Ci0gICAgcmV0dXJuIGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgc3RhdHVzID0gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF2YWlsVG9SZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7CiAgICAgICAgICAgICAgICAgaWYgKCFtRGF0YU1RLT5yZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzdGQ6Om1pbihieXRlcywgYXZhaWxUb1JlYWQpKSkgewpAQCAtNTkxLDYgKzYwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKICAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKICAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oCmluZGV4IGE3ZGYyNzYuLmE2OWNjZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW07CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOwpAQCAtMTAzLDYgKzEwNCw5IEBACiAKICAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKIAorICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKICAgcHJpdmF0ZToKICAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7CiAgICAgSVN0cmVhbSAqbVN0cmVhbTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcAppbmRleCAwNTgwMGEwLi5kYzE3ZjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwCkBAIC0yNyw3ICsyNywxNSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7CisgICAgfQogfQogCiBTdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewpAQCAtOTUsNyArMTAzLDkgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7CkBAIC0xMzMsNiArMTQzLDcgQEAKICAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CiAgICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgewogICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKndyaXR0ZW4gPSAwOwpAQCAtMjY2LDYgKzI3Nyw3IEBACiAgICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKICAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKICAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgICpyZWFkID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oCmluZGV4IDhjOTZjMWYuLmM3MTM2ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAogCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04Myw2ICs4NCw5IEBACiAKICAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKIAorICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKICAgcHJpdmF0ZToKICAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtUG93ZXJMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhiMWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmVhbVBvd2VyTG9nIHsKK3B1YmxpYzoKKyAgICBTdHJlYW1Qb3dlckxvZygpIDoKKyAgICAgICAgbUlzVXNlckRlYnVnT3JFbmdCdWlsZChpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkpLAorICAgICAgICBtUG93ZXJMb2cobnVsbHB0ciksCisgICAgICAgIG1GcmFtZVNpemUoMCkgeworICAgICAgICAvLyB1c2UgaW5pdCgpIHRvIHNldCB1cCB0aGUgcG93ZXIgbG9nLgorICAgIH0KKworICAgIH5TdHJlYW1Qb3dlckxvZygpIHsKKyAgICAgICAgcG93ZXJfbG9nX2Rlc3Ryb3kobVBvd2VyTG9nKTsgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgIG1Qb3dlckxvZyA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiAoZG8gbm90IGNhbGwgdHdpY2UpIGJlZm9yZSB1c2luZyBTdHJlYW1Qb3dlckxvZy4KKyAgICB2b2lkIGluaXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICBpZiAobVBvd2VyTG9nID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IEEgd2F5IHRvIGdldCBjaGFubmVsIGNvdW50IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbCBtYXNrcworICAgICAgICAgICAgLy8gYnV0IGRvZXMgbm90IGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzYW1wbGVSYXRlICoga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2cgPSBwb3dlcl9sb2dfY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbVBvd2VyTG9nIG1heSBiZSBOVUxMIChub3QgdGhlIHJpZ2h0IGJ1aWxkLCBmb3JtYXQgbm90IGFjY2VwdGVkLCBldGMuKS4KKyAgICB9CisKKyAgICAvLyBEdW1wIHRoZSBwb3dlciBsb2cgdG8gZmQuCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3QgeworICAgICAgICAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgKHZvaWQpcG93ZXJfbG9nX2R1bXAoCisgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBmZCwgIiAgICAgICIgLyogcHJlZml4ICovLCBrUG93ZXJMb2dMaW5lcywgMCAvKiBsaW1pdF9ucyAqLyk7CisgICAgfQorCisgICAgLy8gTG9nIHRoZSBhdWRpbyBkYXRhIGNvbnRhaW5lZCBpbiBidWZmZXIuCisgICAgdm9pZCBsb2coY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZUluQnl0ZXMpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyAhPSBudWxscHRyKSB7IC8vIG1GcmFtZVNpemUgaXMgYWx3YXlzIG5vbnplcm8gaWYgbVBvd2VyTG9nIGV4aXN0cy4KKyAgICAgICAgICAgIHBvd2VyX2xvZ19sb2coCisgICAgICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgYnVmZmVyLCBzaXplSW5CeXRlcyAvIG1GcmFtZVNpemUsIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzVXNlckRlYnVnT3JFbmdCdWlsZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgfQorCitwcml2YXRlOgorCisgICAgc3RhdGljIGlubGluZSBib29sIGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSB7CisgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgKHZvaWQpcHJvcGVydHlfZ2V0KCJyby5idWlsZC50eXBlIiwgdmFsdWUsICJ1bmtub3duIik7IC8vIGlnbm9yZSBhY3R1YWwgbGVuZ3RoCisgICAgICAgIHJldHVybiBzdHJjbXAodmFsdWUsICJ1c2VyZGVidWciKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZSwgImVuZyIpID09IDA7CisgICAgfQorCisgICAgLy8gQXVkaW8gc2lnbmFsIHBvd2VyIGxvZyBjb25maWd1cmF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nTGluZXMgPSA0MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyA9IDUwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRW50cmllcyA9ICgxIC8qIG1pbnV0ZXMgKi8gKiA2MCAvKiBzZWNvbmRzICovICogMTAwMCAvKiBtc2VjICovCisgICAgICAgICAgICAvIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyk7CisKKyAgICBjb25zdCBib29sIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgcG93ZXJfbG9nX3QgKm1Qb3dlckxvZzsKKyAgICBzaXplX3QgbUZyYW1lU2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdEhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL1N0cmVhbUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9TdHJlYW1IYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9oaWRsL0hhbERlYXRoSGFuZGxlci5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXIuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAKaW5kZXggY2NhYTJiNC4uMGRkM2YxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icApAQCAtMSArMSBAQAotc3ViZGlycyA9IFsiZmFjdG9yeSJdCitzdWJkaXJzID0gWyJmYWN0b3J5IiwgImNvbmZpZyJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL09XTkVSUyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlM2RlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2tyb2NhcmRAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQorcmFnb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk4YTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icApAQCAtMCwwICsxLDE3IEBACisvLyBFZmZlY3QgY29uZmlndXJhdGlvbgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJlZmZlY3RzY29uZmlnIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWyJzcmMvRWZmZWN0c0NvbmZpZy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidGlueXhtbDIiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyJdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvaW5jbHVkZS9tZWRpYS9FZmZlY3RzQ29uZmlnLmggYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTE3MzBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvaW5jbHVkZS9tZWRpYS9FZmZlY3RzQ29uZmlnLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9FRkZFQ1RTQ09ORklHX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9FRkZFQ1RTQ09ORklHX0gKKworLyoqIEBmaWxlIFBhcnNlcyBhdWRpbyBlZmZlY3RzIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBDIGFuZCBDKysgc3RydWN0dXJlLgorICogQHNlZSBhdWRpb19lZmZlY3RzX2NvbmZfVjJfMC54c2QgZm9yIGRvY3VtZW50YXRpb24gb24gZWFjaCBzdHJ1Y3R1cmUKKyAqLworCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0c0NvbmZpZyB7CisKKy8qKiBEZWZhdWx0IHBhdGggb2YgZWZmZWN0IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KK2NvbnN0ZXhwciBjaGFyIERFRkFVTFRfUEFUSFtdID0gIi92ZW5kb3IvZXRjL2F1ZGlvX2VmZmVjdHMueG1sIjsKKworLyoqIERpcmVjdG9yaWVzIHdoZXJlIHRoZSBlZmZlY3QgbGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoIGZvci4gKi8KK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRIW10gPQorI2lmZGVmIF9fTFA2NF9fCisgICAgICAgIHsiL29kbS9saWI2NC9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliNjQvc291bmRmeCIsICIvc3lzdGVtL2xpYjY0L3NvdW5kZngifTsKKyNlbHNlCisgICAgICAgIHsiL29kbS9saWIvc291bmRmeCIsICIvdmVuZG9yL2xpYi9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliL3NvdW5kZngifTsKKyNlbmRpZgorCitzdHJ1Y3QgTGlicmFyeSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBzdGQ6OnN0cmluZyBwYXRoOworfTsKK3VzaW5nIExpYnJhcmllcyA9IHN0ZDo6dmVjdG9yPExpYnJhcnk+OworCitzdHJ1Y3QgRWZmZWN0SW1wbCB7CisgICAgTGlicmFyeSogbGlicmFyeTsgLy88IE9ubHkgdmFsaWQgYXMgbG9uZyBhcyB0aGUgYXNzb2NpYXRlZCBsaWJyYXJ5IHZlY3RvciBpcyB1bm1vZGlmaWVkCisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworfTsKKworc3RydWN0IEVmZmVjdCA6IHB1YmxpYyBFZmZlY3RJbXBsIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGJvb2wgaXNQcm94eTsKKyAgICBFZmZlY3RJbXBsIGxpYlN3OyAvLzwgT25seSB2YWxpZCBpZiBpc1Byb3h5CisgICAgRWZmZWN0SW1wbCBsaWJIdzsgLy88IE9ubHkgdmFsaWQgaWYgaXNQcm94eQorfTsKKwordXNpbmcgRWZmZWN0cyA9IHN0ZDo6dmVjdG9yPEVmZmVjdD47CisKK3RlbXBsYXRlIDxjbGFzcyBUeXBlPgorc3RydWN0IFN0cmVhbSB7CisgICAgVHlwZSB0eXBlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8RWZmZWN0Pj4gZWZmZWN0czsKK307Cit1c2luZyBPdXRwdXRTdHJlYW0gPSBTdHJlYW08YXVkaW9fc3RyZWFtX3R5cGVfdD47Cit1c2luZyBJbnB1dFN0cmVhbSA9IFN0cmVhbTxhdWRpb19zb3VyY2VfdD47CisKKy8qKiBQYXJzZWQgY29uZmlndXJhdGlvbi4KKyAqIEludGVuZGVkIHRvIGJlIGEgdHJhbnNpZW50IHN0cnVjdHVyZSBvbmx5IHVzZWQgZm9yIGRlc2VyaWFsaXphdGlvbi4KKyAqIE5vdGU6IEV2ZXJ5dGhpbmcgaXMgY29waWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIHhtbCBkb20uCisgKiAgICAgICBJZiBjb3BpZXMgbmVlZGVkIHRvIGJlIGF2b2lkZWQgZHVlIHRvIHBlcmZvcm1hbmNlIGlzc3VlLAorICogICAgICAgY29uc2lkZXIga2VlcGluZyBhIHByaXZhdGUgaGFuZGxlIG9uIHRoZSB4bWwgZG9tIGFuZCByZXBsYWNlIGFsbCBzdHJpbmdzIGJ5IGRvbSBwb2ludGVycy4KKyAqICAgICAgIE9yIGV2ZW4gYmV0dGVyLCB1c2UgU0FYIHBhcnNpbmcgdG8gYXZvaWQgdGhlIGFsbG9jYXRpb25zIGFsbCB0b2dldGhlci4KKyAqLworc3RydWN0IENvbmZpZyB7CisgICAgZmxvYXQgdmVyc2lvbjsKKyAgICBMaWJyYXJpZXMgbGlicmFyaWVzOworICAgIEVmZmVjdHMgZWZmZWN0czsKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW0+IHBvc3Rwcm9jZXNzOworICAgIHN0ZDo6dmVjdG9yPElucHV0U3RyZWFtPiBwcmVwcm9jZXNzOworfTsKKworLyoqIFJlc3VsdCBvZiBgcGFyc2UoY29uc3QgY2hhciopYCAqLworc3RydWN0IFBhcnNpbmdSZXN1bHQgeworICAgIC8qKiBQYXJzZWQgY29uZmlnLCBudWxscHRyIGlmIHRoZSB4bWwgbGliIGNvdWxkIG5vdCBsb2FkIHRoZSBmaWxlICovCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gcGFyc2VkQ29uZmlnOworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50OyAvLzwgTnVtYmVyIG9mIHNraXBwZWQgaW52YWxpZCBsaWJyYXJ5LCBlZmZlY3Qgb3IgcHJvY2Vzc2luZyBjaGFpbgorfTsKKworLyoqIFBhcnNlcyB0aGUgcHJvdmlkZWQgZWZmZWN0IGNvbmZpZ3VyYXRpb24uCisgKiBQYXJzaW5nIGRvIG5vdCBzdG9wIG9mIGZpcnN0IGludmFsaWQgZWxlbWVudCwgYnV0IGNvbnRpbnVlcyB0byB0aGUgbmV4dC4KKyAqIEBzZWUgUGFyc2luZ1Jlc3VsdDo6bmJTa2lwcGVkRWxlbWVudAorICovCitQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOworCit9IC8vIG5hbWVzcGFjZSBlZmZlY3RzQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfRUZGRUNUU0NPTkZJR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NjJmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0NvbmZpZyIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8dGlueXhtbDIuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisKK3VzaW5nIG5hbWVzcGFjZSB0aW55eG1sMjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdHNDb25maWcgeworCisvKiogQWxsIGZ1bmN0aW9ucyBleGNlcHQgYHBhcnNlKGNvbnN0IGNoYXIqKWAgYXJlIHN0YXRpYy4gKi8KK25hbWVzcGFjZSB7CisKKy8qKiBAcmV0dXJuIGFsbCBgbm9kZWBzIGNoaWxkcmVuIHRoYXQgYXJlIGVsZW1lbnRzIGFuZCBtYXRjaCB0aGUgdGFnIGlmIHByb3ZpZGVkLiAqLworc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBYTUxFbGVtZW50Pj4gZ2V0Q2hpbGRyZW4oY29uc3QgWE1MTm9kZSYgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNoaWxkVGFnID0gbnVsbHB0cikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgWE1MRWxlbWVudD4+IGNoaWxkcmVuOworICAgIGZvciAoYXV0byogY2hpbGQgPSBub2RlLkZpcnN0Q2hpbGRFbGVtZW50KGNoaWxkVGFnKTsgY2hpbGQgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPk5leHRTaWJsaW5nRWxlbWVudChjaGlsZFRhZykpIHsKKyAgICAgICAgY2hpbGRyZW4uZW1wbGFjZV9iYWNrKCpjaGlsZCk7CisgICAgfQorICAgIHJldHVybiBjaGlsZHJlbjsKK30KKworLyoqIEByZXR1cm4geG1sIGR1bXAgb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnQuCisgKiBCeSBub3QgcHJvdmlkaW5nIGEgcHJpbnRlciwgaXQgaXMgaW1wbGljaXRseSBjcmVhdGVkIGluIHRoZSBjYWxsZXIgY29udGV4dC4KKyAqIEluIHN1Y2ggY2FzZSB0aGUgcmV0dXJuIHBvaW50ZXIgaGFzIHRoZSBzYW1lIGxpZmV0aW1lIGFzIHRoZSBleHByZXNzaW9uIGNvbnRhaW5pbmcgZHVtcCgpLgorICovCitjb25zdCBjaGFyKiBkdW1wKGNvbnN0IFhNTEVsZW1lbnQmIGVsZW1lbnQsIFhNTFByaW50ZXImJiBwcmludGVyID0ge30pIHsKKyAgICBlbGVtZW50LkFjY2VwdCgmcHJpbnRlcik7CisgICAgcmV0dXJuIHByaW50ZXIuQ1N0cigpOworfQorCisKK2Jvb2wgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCkKK3sKKyAgICB1aW50MzJfdCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1dWlkLT50aW1lTG93ID0gKHVpbnQzMl90KXRtcFswXTsKKyAgICB1dWlkLT50aW1lTWlkID0gKHVpbnQxNl90KXRtcFsxXTsKKyAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uID0gKHVpbnQxNl90KXRtcFsyXTsKKyAgICB1dWlkLT5jbG9ja1NlcSA9ICh1aW50MTZfdCl0bXBbM107CisgICAgdXVpZC0+bm9kZVswXSA9ICh1aW50OF90KXRtcFs0XTsKKyAgICB1dWlkLT5ub2RlWzFdID0gKHVpbnQ4X3QpdG1wWzVdOworICAgIHV1aWQtPm5vZGVbMl0gPSAodWludDhfdCl0bXBbNl07CisgICAgdXVpZC0+bm9kZVszXSA9ICh1aW50OF90KXRtcFs3XTsKKyAgICB1dWlkLT5ub2RlWzRdID0gKHVpbnQ4X3QpdG1wWzhdOworICAgIHV1aWQtPm5vZGVbNV0gPSAodWludDhfdCl0bXBbOV07CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIE1hcCB0aGUgZW51bSBhbmQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nIHR5cGUuCisgKiAgSW50ZW5kZWQgdG8gYmUgc3BlY2lhbGl6ZWQgZm9yIGVhY2ggZW51bSB0byBkZXNlcmlhbGl6ZS4KKyAqICBUaGUgZ2VuZXJhbCB0ZW1wbGF0ZSBpcyBkaXNhYmxlZC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIEVudW0+Citjb25zdGV4cHIgc3RkOjplbmFibGVfaWY8ZmFsc2UsIEVudW0+IFNUUkVBTV9OQU1FX01BUDsKKworLyoqIEFsbCBvdXRwdXQgc3RyZWFtIHR5cGVzIHdoaWNoIHN1cHBvcnQgZWZmZWN0cy4KKyAqIFRoaXMgbmVlZCB0byBiZSBrZXB0IGluIHNpbmsgd2l0aCB0aGUgeHNkIHN0cmVhbU91dHB1dFR5cGUuCisgKi8KK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgc3RkOjpwYWlyPGF1ZGlvX3N0cmVhbV90eXBlX3QsIGNvbnN0IGNoYXIqPiBTVFJFQU1fTkFNRV9NQVA8YXVkaW9fc3RyZWFtX3R5cGVfdD5bXSA9IHsKKyAgICAgICAge0FVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCAidm9pY2VfY2FsbCJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX1NZU1RFTSwgInN5c3RlbSJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX1JJTkcsICJyaW5nIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fTVVTSUMsICJtdXNpYyJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0FMQVJNLCAiYWxhcm0ifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sICJub3RpZmljYXRpb24ifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPLCAiYmx1ZXRvb3RoX3NjbyJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsICJlbmZvcmNlZF9hdWRpYmxlIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fRFRNRiwgImR0bWYifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9UVFMsICJ0dHMifSwKK307CisKKy8qKiBBbGwgaW5wdXQgc3RyZWFtIHR5cGVzIHdoaWNoIHN1cHBvcnQgZWZmZWN0cy4KKyAqIFRoaXMgbmVlZCB0byBiZSBrZXB0IGluIHNpbmsgd2l0aCB0aGUgeHNkIHN0cmVhbU91dHB1dFR5cGUuCisgKi8KK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgc3RkOjpwYWlyPGF1ZGlvX3NvdXJjZV90LCBjb25zdCBjaGFyKj4gU1RSRUFNX05BTUVfTUFQPGF1ZGlvX3NvdXJjZV90PltdID0geworICAgICAgICB7QVVESU9fU09VUkNFX01JQywgIm1pYyJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSywgInZvaWNlX3VwbGluayJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LLCAidm9pY2VfZG93bmxpbmsifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9DQUxMLCAidm9pY2VfY2FsbCJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX0NBTUNPUkRFUiwgImNhbWNvcmRlciJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLCAidm9pY2VfcmVjb2duaXRpb24ifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCAidm9pY2VfY29tbXVuaWNhdGlvbiJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VELCAidW5wcm9jZXNzZWQifSwKK307CisKKy8qKiBGaW5kIHRoZSBzdHJlYW0gdHlwZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIG5hbWUgb3IgcmV0dXJuIGZhbHNlICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4KK2Jvb2wgc3RyaW5nVG9TdHJlYW1UeXBlKGNvbnN0IGNoYXIgKnN0cmVhbU5hbWUsIFR5cGUqIHR5cGUpCit7CisgICAgZm9yIChhdXRvJiBzdHJlYW1OYW1lUGFpciA6IFNUUkVBTV9OQU1FX01BUDxUeXBlPikgeworICAgICAgICBpZiAoc3RyY21wKHN0cmVhbU5hbWVQYWlyLnNlY29uZCwgc3RyZWFtTmFtZSkgPT0gMCkgeworICAgICAgICAgICAgKnR5cGUgPSBzdHJlYW1OYW1lUGFpci5maXJzdDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqIFBhcnNlIGEgbGlicmFyeSB4bWwgbm90ZSBhbmQgcHVzaCB0aGUgcmVzdWx0IGluIGxpYnJhcmllcyBvciByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZS4gKi8KK2Jvb2wgcGFyc2VMaWJyYXJ5KGNvbnN0IFhNTEVsZW1lbnQmIHhtbExpYnJhcnksIExpYnJhcmllcyogbGlicmFyaWVzKSB7CisgICAgY29uc3QgY2hhciogbmFtZSA9IHhtbExpYnJhcnkuQXR0cmlidXRlKCJuYW1lIik7CisgICAgY29uc3QgY2hhciogcGF0aCA9IHhtbExpYnJhcnkuQXR0cmlidXRlKCJwYXRoIik7CisgICAgaWYgKG5hbWUgPT0gbnVsbHB0ciB8fCBwYXRoID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImxpYnJhcnkgbXVzdCBoYXZlIGEgbmFtZSBhbmQgYSBwYXRoOiAlcyIsIGR1bXAoeG1sTGlicmFyeSkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxpYnJhcmllcy0+cHVzaF9iYWNrKHtuYW1lLCBwYXRofSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBGaW5kIGFuIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIGJ5IGl0cyBuYW1lLgorICogQHJldHVybiBudWxscHRyIGlmIG5vdCBmb3VuZCwgdGhlIGVsbGVtZW50cyBhZGRyZXNzIGlmIGZvdW5kLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1QqIGZpbmRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgc3RkOjp2ZWN0b3I8VD4mIGNvbGxlY3Rpb24pIHsKKyAgICBhdXRvIGl0ID0gZmluZF9pZihiZWdpbihjb2xsZWN0aW9uKSwgZW5kKGNvbGxlY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXSAoYXV0byYgaXRlbSkgeyByZXR1cm4gaXRlbS5uYW1lID09IG5hbWU7IH0pOworICAgIHJldHVybiBpdCAhPSBlbmQoY29sbGVjdGlvbikgPyAmKml0IDogbnVsbHB0cjsKK30KKworLyoqIFBhcnNlIGFuIGVmZmVjdCBmcm9tIGFuIHhtbCBlbGVtZW50IGRlc2NyaWJpbmcgaXQuCisgKiBAcmV0dXJuIHRydWUgYW5kIHB1c2hlcyB0aGUgZWZmZWN0IGluIGVmZmVjdHMgb24gc3VjY2VzcywKKyAqICAgICAgICAgZmFsc2Ugb24gZmFpbHVyZS4gKi8KK2Jvb2wgcGFyc2VFZmZlY3QoY29uc3QgWE1MRWxlbWVudCYgeG1sRWZmZWN0LCBMaWJyYXJpZXMmIGxpYnJhcmllcywgRWZmZWN0cyogZWZmZWN0cykgeworICAgIEVmZmVjdCBlZmZlY3R7fTsKKworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSB4bWxFZmZlY3QuQXR0cmlidXRlKCJuYW1lIik7CisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgbXVzdCBoYXZlIGEgbmFtZTogJXMiLCB4bWxFZmZlY3QuVmFsdWUoKSwgZHVtcCh4bWxFZmZlY3QpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlZmZlY3QubmFtZSA9IG5hbWU7CisKKyAgICAvLyBGdW5jdGlvbiB0byBwYXJzZSBlZmZlY3QubGlicmFyeSBhbmQgZWZmZWN0LnV1aWQgZnJvbSB4bWwKKyAgICBhdXRvIHBhcnNlSW1wbCA9IFsmbGlicmFyaWVzXShjb25zdCBYTUxFbGVtZW50JiB4bWxJbXBsLCBFZmZlY3RJbXBsJiBlZmZlY3QpIHsKKyAgICAgICAgLy8gUmV0cmlldmUgbGlicmFyeSBuYW1lIGFuZCB1dWlkIGZyb20geG1sCisgICAgICAgIGNvbnN0IGNoYXIqIGxpYnJhcnlOYW1lID0geG1sSW1wbC5BdHRyaWJ1dGUoImxpYnJhcnkiKTsKKyAgICAgICAgY29uc3QgY2hhciogdXVpZCA9IHhtbEltcGwuQXR0cmlidXRlKCJ1dWlkIik7CisgICAgICAgIGlmIChsaWJyYXJ5TmFtZSA9PSBudWxscHRyIHx8IHV1aWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoImVmZmVjdCBtdXN0IGhhdmUgYSBsaWJyYXJ5IG5hbWUgYW5kIGEgdXVpZDogJXMiLCBkdW1wKHhtbEltcGwpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgbGlicmFyeSBuYW1lIHRvIGEgcG9pbnRlciB0byB0aGUgcHJldmlvdXNseSBsb2FkZWQgbGlicmFyeQorICAgICAgICBhdXRvKiBsaWJyYXJ5ID0gZmluZEJ5TmFtZShsaWJyYXJ5TmFtZSwgbGlicmFyaWVzKTsKKyAgICAgICAgaWYgKGxpYnJhcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgcmVmZXJlbmNlZCBpbjogJXMiLCBkdW1wKHhtbEltcGwpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlZmZlY3QubGlicmFyeSA9IGxpYnJhcnk7CisKKyAgICAgICAgaWYgKCFzdHJpbmdUb1V1aWQodXVpZCwgJmVmZmVjdC51dWlkKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdXVpZCBpbjogJXMiLCBkdW1wKHhtbEltcGwpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgaWYgKCFwYXJzZUltcGwoeG1sRWZmZWN0LCBlZmZlY3QpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgcHJveHkgZWZmZWN0cworICAgIGVmZmVjdC5pc1Byb3h5ID0gZmFsc2U7CisgICAgaWYgKHN0ZDo6c3RyY21wKHhtbEVmZmVjdC5OYW1lKCksICJlZmZlY3RQcm94eSIpID09IDApIHsKKyAgICAgICAgZWZmZWN0LmlzUHJveHkgPSB0cnVlOworCisgICAgICAgIC8vIEZ1bmN0aW9uIHRvIHBhcnNlIGxpYmh3IGFuZCBsaWJzdworICAgICAgICBhdXRvIHBhcnNlUHJveHkgPSBbJnhtbEVmZmVjdCwgJnBhcnNlSW1wbF0oY29uc3QgY2hhciogdGFnLCBFZmZlY3RJbXBsJiBwcm94eUxpYikgeworICAgICAgICAgICAgYXV0byogeG1sUHJveHlMaWIgPSB4bWxFZmZlY3QuRmlyc3RDaGlsZEVsZW1lbnQodGFnKTsKKyAgICAgICAgICAgIGlmICh4bWxQcm94eUxpYiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImVmZmVjdFByb3h5IG11c3QgY29udGFpbiBhIDwlcz46ICVzIiwgdGFnLCBkdW1wKCp4bWxQcm94eUxpYikpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYXJzZUltcGwoKnhtbFByb3h5TGliLCBwcm94eUxpYik7CisgICAgICAgIH07CisgICAgICAgIGlmICghcGFyc2VQcm94eSgibGliaHciLCBlZmZlY3QubGliSHcpIHx8ICFwYXJzZVByb3h5KCJsaWJzdyIsIGVmZmVjdC5saWJTdykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVmZmVjdHMtPnB1c2hfYmFjayhzdGQ6Om1vdmUoZWZmZWN0KSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBQYXJzZSBhbiBzdHJlYW0gZnJvbSBhbiB4bWwgZWxlbWVudCBkZXNjcmliaW5nIGl0LgorICogQHJldHVybiB0cnVlIGFuZCBwdXNoZXMgdGhlIHN0cmVhbSBpbiBzdHJlYW1zIG9uIHN1Y2Nlc3MsCisgKiAgICAgICAgIGZhbHNlIG9uIGZhaWx1cmUuICovCit0ZW1wbGF0ZSA8Y2xhc3MgU3RyZWFtPgorYm9vbCBwYXJzZVN0cmVhbShjb25zdCBYTUxFbGVtZW50JiB4bWxTdHJlYW0sIEVmZmVjdHMmIGVmZmVjdHMsIHN0ZDo6dmVjdG9yPFN0cmVhbT4qIHN0cmVhbXMpIHsKKyAgICBjb25zdCBjaGFyKiBzdHJlYW1UeXBlID0geG1sU3RyZWFtLkF0dHJpYnV0ZSgidHlwZSIpOworICAgIGlmIChzdHJlYW1UeXBlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoInN0cmVhbSBtdXN0IGhhdmUgYSB0eXBlOiAlcyIsIGR1bXAoeG1sU3RyZWFtKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU3RyZWFtIHN0cmVhbTsKKyAgICBpZiAoIXN0cmluZ1RvU3RyZWFtVHlwZShzdHJlYW1UeXBlLCAmc3RyZWFtLnR5cGUpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVzOiAlcyIsIHN0cmVhbVR5cGUsIGR1bXAoeG1sU3RyZWFtKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIHhtbEFwcGx5IDogZ2V0Q2hpbGRyZW4oeG1sU3RyZWFtLCAiYXBwbHkiKSkgeworICAgICAgICBjb25zdCBjaGFyKiBlZmZlY3ROYW1lID0geG1sQXBwbHkuZ2V0KCkuQXR0cmlidXRlKCJlZmZlY3QiKTsKKyAgICAgICAgaWYgKGVmZmVjdE5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoInN0cmVhbS9hcHBseSBtdXN0IGhhdmUgcmVmZXJlbmNlIGFuIGVmZmVjdDogJXMiLCBkdW1wKHhtbEFwcGx5KSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYXV0byogZWZmZWN0ID0gZmluZEJ5TmFtZShlZmZlY3ROYW1lLCBlZmZlY3RzKTsKKyAgICAgICAgaWYgKGVmZmVjdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgZWZmZWN0IHJlZmVyZW5jZWQgaW46ICVzIiwgZHVtcCh4bWxBcHBseSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0cmVhbS5lZmZlY3RzLmVtcGxhY2VfYmFjaygqZWZmZWN0KTsKKyAgICB9CisgICAgc3RyZWFtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShzdHJlYW0pKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlCisKK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCkgeworICAgIFhNTERvY3VtZW50IGRvYzsKKyAgICBkb2MuTG9hZEZpbGUocGF0aCk7CisgICAgaWYgKGRvYy5FcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgJXM6IFRpbnl4bWwyIGVycm9yICglZCk6ICVzICVzIiwgcGF0aCwKKyAgICAgICAgICAgICAgZG9jLkVycm9ySUQoKSwgZG9jLkdldEVycm9yU3RyMSgpLCBkb2MuR2V0RXJyb3JTdHIyKCkpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OworICAgIH0KKworICAgIGF1dG8gY29uZmlnID0gc3RkOjptYWtlX3VuaXF1ZTxDb25maWc+KCk7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnRzID0gMDsKKyAgICBhdXRvIHJlZ2lzdGVyRmFpbHVyZSA9IFsmbmJTa2lwcGVkRWxlbWVudHNdKGJvb2wgcmVzdWx0KSB7CisgICAgICAgIG5iU2tpcHBlZEVsZW1lbnRzICs9IHJlc3VsdCA/IDAgOiAxOworICAgIH07CisgICAgZm9yIChhdXRvJiB4bWxDb25maWcgOiBnZXRDaGlsZHJlbihkb2MsICJhdWRpb19lZmZlY3RzX2NvbmYiKSkgeworCisgICAgICAgIC8vIFBhcnNlIGxpYnJhcnkKKyAgICAgICAgZm9yIChhdXRvJiB4bWxMaWJyYXJpZXMgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJsaWJyYXJpZXMiKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB4bWxMaWJyYXJ5IDogZ2V0Q2hpbGRyZW4oeG1sTGlicmFyaWVzLCAibGlicmFyeSIpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlTGlicmFyeSh4bWxMaWJyYXJ5LCAmY29uZmlnLT5saWJyYXJpZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIGVmZmVjdHMKKyAgICAgICAgZm9yIChhdXRvJiB4bWxFZmZlY3RzIDogZ2V0Q2hpbGRyZW4oeG1sQ29uZmlnLCAiZWZmZWN0cyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbEVmZmVjdCA6IGdldENoaWxkcmVuKHhtbEVmZmVjdHMpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlRWZmZWN0KHhtbEVmZmVjdCwgY29uZmlnLT5saWJyYXJpZXMsICZjb25maWctPmVmZmVjdHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHByZSBwcm9jZXNzaW5nIGNoYWlucworICAgICAgICBmb3IgKGF1dG8mIHhtbFByZXByb2Nlc3MgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJwcmVwcm9jZXNzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sU3RyZWFtIDogZ2V0Q2hpbGRyZW4oeG1sUHJlcHJvY2VzcywgInN0cmVhbSIpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlU3RyZWFtKHhtbFN0cmVhbSwgY29uZmlnLT5lZmZlY3RzLCAmY29uZmlnLT5wcmVwcm9jZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSBwb3N0IHByb2Nlc3NpbmcgY2hhaW5zCisgICAgICAgIGZvciAoYXV0byYgeG1sUG9zdHByb2Nlc3MgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJwb3N0cHJvY2VzcyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbFN0cmVhbSA6IGdldENoaWxkcmVuKHhtbFBvc3Rwcm9jZXNzLCAic3RyZWFtIikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VTdHJlYW0oeG1sU3RyZWFtLCBjb25maWctPmVmZmVjdHMsICZjb25maWctPnBvc3Rwcm9jZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHtzdGQ6Om1vdmUoY29uZmlnKSwgbmJTa2lwcGVkRWxlbWVudHN9OworfQorCit9IC8vIG5hbWVzcGFjZSBlZmZlY3RzQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCmluZGV4IDczZjZlZjUuLmE1ZmJmMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCkBAIC0yMCw2ICsyMCw3IEBACiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKKyMtREJVSUxEX0ZMT0FUCiBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKaW5kZXggZjI3ZDVjYS4uNTE5ZjRhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCkBAIC0zMyw2ICszMywxMCBAQAogCiAjZGVmaW5lIE1JTlVTXzNfREJfSU5fUTE5XzEyIDI4OTYgLy8gLTNkQiA9IDAuNzA3ICogMl4xMiA9IDI4OTYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIE1JTlVTXzNfREJfSU5fRkxPQVQgMC43MDcxMDY3OGYgLy8gLTNkQiA9IDAuNzA3MTA2NzhmCisjZW5kaWYKKwogLy8gc3Vic2V0IG9mIHBvc3NpYmxlIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlcywgYW5kIEFVRElPX0NIQU5ORUxfT1VUXyogcmVuYW1lZCB0byBDSEFOTkVMX01BU0tfKgogdHlwZWRlZiBlbnVtIHsKICAgICBDSEFOTkVMX01BU0tfUVVBRF9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLApAQCAtODIsOCArODYsMTkgQEAKIAogLy8gbnVtYmVyIG9mIGVmZmVjdHMgaW4gdGhpcyBsaWJyYXJ5CiBjb25zdCBpbnQga05iRWZmZWN0cyA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7Ci0KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitzdGF0aWMgTFZNX0ZMT0FUIGNsYW1wX2Zsb2F0KExWTV9GTE9BVCBhKSB7CisgICAgaWYgKGEgPiAxLjBmKSB7CisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKyAgICBlbHNlIGlmIChhIDwgLTEuMGYpIHsKKyAgICAgICAgcmV0dXJuIC0xLjBmOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFRlc3QgY29kZQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yODYsNyArMzAxLDcgQEAKICAgICByZXR1cm4gLUVJTlZBTDsKIH0KIAotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKi0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KIAogc3RhdGljIGludCBEb3dubWl4X1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCkBAIC0zODUsNyArNDAwLDEwOCBAQAogCiAgICAgcmV0dXJuIDA7CiB9CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KKy8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLwogCitzdGF0aWMgaW50IERvd25taXhfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKKyAgICAgICAgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKSB7CisKKyAgICBkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyOworICAgIExWTV9GTE9BVCAqcFNyYywgKnBEc3Q7CisgICAgZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSA9IChkb3dubWl4X21vZHVsZV90ICopc2VsZjsKKworICAgIGlmIChwRHdtTW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBEb3dubWl4ZXIgPSAoZG93bm1peF9vYmplY3RfdCopICZwRHdtTW9kdWxlLT5jb250ZXh0OworCisgICAgaWYgKHBEb3dubWl4ZXItPnN0YXRlID09IERPV05NSVhfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGFuIHVuaW5pdGlhbGl6ZWQgZG93bm1peGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSBpZiAocERvd25taXhlci0+c3RhdGUgPT0gRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGEgbm9uLWNvbmZpZ3VyZWQgZG93bm1peGVyIik7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisKKyAgICBwU3JjID0gKExWTV9GTE9BVCAqKSBpbkJ1ZmZlci0+czE2OworICAgIHBEc3QgPSAoTFZNX0ZMT0FUICopIG91dEJ1ZmZlci0+czE2OworICAgIHNpemVfdCBudW1GcmFtZXMgPSBvdXRCdWZmZXItPmZyYW1lQ291bnQ7CisKKyAgICBjb25zdCBib29sIGFjY3VtdWxhdGUgPQorICAgICAgICAgICAgKHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKKyAgICBjb25zdCB1aW50MzJfdCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayA9IHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKKworICAgIHN3aXRjaChwRG93bm1peGVyLT50eXBlKSB7CisKKyAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX1NUUklQOgorICAgICAgICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgcFNyY1swXSk7CisgICAgICAgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIHBTcmNbMV0pOworICAgICAgICAgICAgICAgICAgcFNyYyArPSBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50OworICAgICAgICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICBwRHN0WzBdID0gcFNyY1swXTsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMV0gPSBwU3JjWzFdOworICAgICAgICAgICAgICAgICAgcFNyYyArPSBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50OworICAgICAgICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX0ZPTEQ6CisjaWZkZWYgRE9XTk1JWF9BTFdBWVNfVVNFX0dFTkVSSUNfRE9XTk1JWEVSCisgICAgICAgICAgLy8gYnlwYXNzIHRoZSBvcHRpbWl6ZWQgZG93bm1peCByb3V0aW5lcyBmb3IgdGhlIGNvbW1vbiBmb3JtYXRzCisgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKKyAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JSIgUFJJeDMyICIgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIC8vIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKKyAgICAgICAgc3dpdGNoKChkb3dubWl4X2lucHV0X2NoYW5uZWxfbWFza190KWRvd25taXhJbnB1dENoYW5uZWxNYXNrKSB7CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSzoKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9TSURFOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVF1YWQocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIQU5ORUxfTUFTS181UE9JTlQxX0JBQ0s6CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERToKKyAgICAgICAgICAgIERvd25taXhfZm9sZEZyb201UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfN1BPSU5UMToKKyAgICAgICAgICAgIERvd25taXhfZm9sZEZyb203UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICghRG93bm1peF9mb2xkR2VuZXJpYygKKyAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKIAogc3RhdGljIGludCBEb3dubWl4X0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCiAgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CkBAIC04MTgsNiArOTM0LDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKQEAgLTg0NSw3ICs5NjIsMzUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2Vsc2UKK3ZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgeworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBSTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIFJSCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gRkwgKyBSTAorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAoKHBTcmNbMF0gKyBwU3JjWzJdKSAvIDIuMGYpKTsKKyAgICAgICAgICAgIC8vIEZSICsgUlIKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKChwU3JjWzFdICsgcFNyY1szXSkgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIEZMICsgUkwKKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdCgocFNyY1swXSArIHBTcmNbMl0pIC8gMi4wZik7CisgICAgICAgICAgICAvLyBGUiArIFJSCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQoKHBTcmNbMV0gKyBwU3JjWzNdKSAvIDIuMGYpOworICAgICAgICAgICAgcFNyYyArPSA0OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MSgpCkBAIC04NjQsNiArMTAwOSw3IEBACiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKICAgICBpbnQzMl90IGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAogICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCkBAIC05MDgsNyArMTA1NCw1MiBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZWxzZQordm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisgICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKKyAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKKyAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQorICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNV07CisgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSA2OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgorICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwU3JjICs9IDY7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb203UG9pbnQxKCkKQEAgLTkyNyw2ICsxMTE4LDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKQEAgLTk3Myw4ICsxMTY1LDU0IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KLQorI2Vsc2UKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgeworICAgIExWTV9GTE9BVCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgRkMKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBMRkUKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNCBpcyBSTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA1IGlzIFJSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDYgaXMgU0wKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNyBpcyBTUgorICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAorICAgIC8vIGZvciBldmVyeSBzYW1wbGUKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzZdICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbN10gKyBwU3JjWzVdOworICAgICAgICAgICAgLy9hY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSA4OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgorICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgorICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzddICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwU3JjICs9IDg7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEb3dubWl4X2ZvbGRHZW5lcmljKCkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTAwMSw2ICsxMjM5LDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAogICAgICAgICB1aW50MzJfdCBtYXNrLCBpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogCkBAIC0xMDkyLDMgKzEzMzEsOTYgQEAKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CisjZWxzZQorYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICB1aW50MzJfdCBtYXNrLCBMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisKKyAgICBpZiAoIURvd25taXhfdmFsaWRDaGFubmVsTWFzayhtYXNrKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBoYXNTaWRlcyA9IChtYXNrICYga1NpZGVzKSAhPSAwOworICAgIGNvbnN0IGJvb2wgaGFzQmFja3MgPSAobWFzayAmIGtCYWNrcykgIT0gMDsKKworICAgIGNvbnN0IGludCBudW1DaGFuID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOworICAgIGNvbnN0IGJvb2wgaGFzRkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUik7CisgICAgY29uc3QgYm9vbCBoYXNMRkUgPQorICAgICAgICAgICAgKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSk7CisgICAgY29uc3QgYm9vbCBoYXNCQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUik7CisgICAgLy8gY29tcHV0ZSBhdCB3aGF0IGluZGV4IGVhY2ggY2hhbm5lbCBpczogc2FtcGxlcyB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgLy8gICBGTCBGUiBGQyBMRkUgQkwgQlIgQkMgU0wgU1IKKyAgICAvLyB3aGVuIGEgY2hhbm5lbCBpcyBub3QgcHJlc2VudCwgaXRzIGluZGV4IGlzIHNldCB0byB0aGUgc2FtZSBhcyB0aGUgaW5kZXggb2YgdGhlIHByZWNlZGluZworICAgIC8vIGNoYW5uZWwKKyAgICBjb25zdCBpbnQgaW5kZXhGQyAgPSBoYXNGQyAgICA/IDIgICAgICAgICAgICA6IDE7ICAgICAgICAvLyBmcm9udCBjZW50ZXIKKyAgICBjb25zdCBpbnQgaW5kZXhMRkUgPSBoYXNMRkUgICA/IGluZGV4RkMgKyAxICA6IGluZGV4RkM7ICAvLyBsb3cgZnJlcXVlbmN5CisgICAgY29uc3QgaW50IGluZGV4QkwgID0gaGFzQmFja3MgPyBpbmRleExGRSArIDEgOiBpbmRleExGRTsgLy8gYmFjayBsZWZ0CisgICAgY29uc3QgaW50IGluZGV4QlIgID0gaGFzQmFja3MgPyBpbmRleEJMICsgMSAgOiBpbmRleEJMOyAgLy8gYmFjayByaWdodAorICAgIGNvbnN0IGludCBpbmRleEJDICA9IGhhc0JDICAgID8gaW5kZXhCUiArIDEgIDogaW5kZXhCUjsgIC8vIGJhY2sgY2VudGVyCisgICAgY29uc3QgaW50IGluZGV4U0wgID0gaGFzU2lkZXMgPyBpbmRleEJDICsgMSAgOiBpbmRleEJDOyAgLy8gc2lkZSBsZWZ0CisgICAgY29uc3QgaW50IGluZGV4U1IgID0gaGFzU2lkZXMgPyBpbmRleFNMICsgMSAgOiBpbmRleFNMOyAgLy8gc2lkZSByaWdodAorCisgICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyc0xmZUNvbnRyaWI7CisgICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0CisgICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQorICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiA9IDA7CisgICAgICAgICAgICBpZiAoaGFzRkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhGQ107IH0KKyAgICAgICAgICAgIGlmIChoYXNMRkUpIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07IH0KKyAgICAgICAgICAgIGlmIChoYXNCQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEJDXTsgfQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgKj0gTUlOVVNfM19EQl9JTl9GTE9BVDsKKyAgICAgICAgICAgIC8vIGFsd2F5cyBoYXMgRkwvRlIKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXTsKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXTsKKyAgICAgICAgICAgIC8vIG1peCBpbiBzaWRlcyBhbmQgYmFja3MKKyAgICAgICAgICAgIGlmIChoYXNTaWRlcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhTTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleFNSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNCYWNrcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhCTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleEJSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgcnQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSBudW1DaGFuOworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlIGNvbnRyaWJ1dGlvbiBvZiBGQywgQkMgYW5kIExGRQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgPSAwOworICAgICAgICAgICAgaWYgKGhhc0ZDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4RkNdOyB9CisgICAgICAgICAgICBpZiAoaGFzTEZFKSB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhMRkVdOyB9CisgICAgICAgICAgICBpZiAoaGFzQkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhCQ107IH0KKyAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliICo9IE1JTlVTXzNfREJfSU5fRkxPQVQ7CisgICAgICAgICAgICAvLyBhbHdheXMgaGFzIEZML0ZSCisgICAgICAgICAgICBsdCA9IHBTcmNbMF07CisgICAgICAgICAgICBydCA9IHBTcmNbMV07CisgICAgICAgICAgICAvLyBtaXggaW4gc2lkZXMgYW5kIGJhY2tzCisgICAgICAgICAgICBpZiAoaGFzU2lkZXMpIHsKKyAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4U0xdOworICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhTUl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzQmFja3MpIHsKKyAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4QkxdOworICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhCUl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdCArPSBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAgICAgICAgIHJ0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBTcmMgKz0gbnVtQ2hhbjsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKaW5kZXggMjM5OWFiZC4uYzFiZTBmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCkBAIC0yNyw3ICsyNyw5IEBACiAqLwogCiAjZGVmaW5lIERPV05NSVhfT1VUUFVUX0NIQU5ORUxTIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZNX0ZMT0FUIGZsb2F0CisjZW5kaWYKIHR5cGVkZWYgZW51bSB7CiAgICAgRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVELAogICAgIERPV05NSVhfU1RBVEVfSU5JVElBTElaRUQsCkBAIC05NSwxMSArOTcsMTggQEAKIGludCBEb3dubWl4X1Jlc2V0KGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGJvb2wgaW5pdCk7CiBpbnQgRG93bm1peF9zZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3Qgc2l6ZSwgdm9pZCAqcFZhbHVlKTsKIGludCBEb3dubWl4X2dldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Cit2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOworYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICB1aW50MzJfdCBtYXNrLCBMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKKyNlbHNlCiB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgIHVpbnQzMl90IG1hc2ssIGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKKyNlbmRpZgogCiAjZW5kaWYgLypBTkRST0lEX0VGRkVDVERPV05NSVhfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icAppbmRleCAxNjY4MGJkLi5kZGJmZGQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icApAQCAtMTAsMTggKzEwLDQ3IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmVmZmVjdHMiLAogICAgIHZlbmRvcjogdHJ1ZSwKLSAgICBzcmNzOiBbIkVmZmVjdHNGYWN0b3J5LmMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICAiRWZmZWN0c0ZhY3RvcnkuYyIsCisgICAgICAgICAiRWZmZWN0c0NvbmZpZ0xvYWRlci5jIiwKKyAgICAgICAgICJFZmZlY3RzRmFjdG9yeVN0YXRlLmMiLAorICAgICAgICAgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwIiwKKyAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZWZmZWN0c2NvbmZpZyIsCiAgICAgXSwKLQotICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlIl0sCisgICAgY2ZsYWdzOiBbIi1mdmlzaWJpbGl0eT1oaWRkZW4iXSwKIAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczpbImluY2x1ZGUvbWVkaWEiXSwKIAotICAgIGhlYWRlcl9saWJzOiBbImxpYmVmZmVjdHNfaGVhZGVycyJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgICAgICAibGliZWZmZWN0c19oZWFkZXJzIiwKKyAgICBdLAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliZWZmZWN0c19oZWFkZXJzIl0sCiB9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImR1bXBFZmZlY3RDb25maWdGaWxlIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWyJ0ZXN0L0R1bXBDb25maWcuY3BwIl0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJlZmZlY3RzY29uZmlnIiwKKyAgICAgICAgImxpYmVmZmVjdHMiLAorICAgIF0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOlsiLiIsICJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2VmMzZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYwpAQCAtMCwwICsxLDQzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlDb25maWdMb2FkZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgIExvY2FsIGZ1bmN0aW9ucyBwcm90b3R5cGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCk7CitzdGF0aWMgaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpOworc3RhdGljIGludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KTsKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdChjbm9kZSAqbm9kZSk7CisvLyBUbyBnZXQgYW5kIGFkZCB0aGUgZWZmZWN0IHBvaW50ZWQgYnkgdGhlIHBhc3NlZCBub2RlIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAorc3RhdGljIGludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpOworc3RhdGljIGxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpOworCitzdGF0aWMgbGliX2VudHJ5X3QgKmdDYWNoZWRMaWJyYXJ5OyAgLy8gbGFzdCBsaWJyYXJ5IGFjY2Vzc2VkIGJ5IGdldExpYnJhcnkoKQorCitpbnQgRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpCit7CisgICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKKyAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICByZXR1cm4gbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgY25vZGUgKnJvb3Q7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSBsb2FkX2ZpbGUocGF0aCwgTlVMTCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7CisgICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7CisgICAgbG9hZExpYnJhcmllcyhyb290KTsKKyAgICBsb2FkRWZmZWN0cyhyb290KTsKKyAgICBjb25maWdfZnJlZShyb290KTsKKyAgICBmcmVlKHJvb3QpOworICAgIGZyZWUoZGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGU7CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSSUVTX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGxvYWRMaWJyYXJ5KG5vZGUsIG5vZGUtPm5hbWUpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfX0xQNjRfXworLy8gYXVkaW9fZWZmZWN0cy5jb25mIGFsd2F5cyBzcGVjaWZpZXMgMzIgYml0IGxpYiBwYXRoOiBjb252ZXJ0IHRvIDY0IGJpdCBwYXRoIGlmIG5lZWRlZAorc3RhdGljIGNvbnN0IGNoYXIgKmtMaWJyYXJ5UGF0aFJvb3RbXSA9CisgICAgICAgIHsiL29kbS9saWI2NC9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliNjQvc291bmRmeCIsICIvc3lzdGVtL2xpYjY0L3NvdW5kZngifTsKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KKyAgICAgICAgeyIvb2RtL2xpYi9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliL3NvdW5kZngiLCAiL3N5c3RlbS9saWIvc291bmRmeCJ9OworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBpbnQga0xpYnJhcnlQYXRoUm9vdFNpemUgPQorICAgICAgICAoc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3QpIC8gc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3RbMF0pKTsKKworLy8gQ2hlY2tzIGlmIHRoZSBsaWJyYXJ5IHBhdGggcGFzc2VkIGFzIGxpYl9wYXRoX2luIGNhbiBiZSBvcGVuZWQgYW5kIGlmIG5vdAorLy8gdHJpZXMgaW4gc3RhbmRhcmQgZWZmZWN0IGxpYnJhcnkgZGlyZWN0b3JpZXMgd2l0aCBqdXN0IHRoZSBsaWJyYXJ5IG5hbWUgYW5kIHJldHVybnMgY29ycmVjdCBwYXRoCisvLyBpbiBsaWJfcGF0aF9vdXQKK2ludCBjaGVja0xpYnJhcnlQYXRoKGNvbnN0IGNoYXIgKmxpYl9wYXRoX2luLCBjaGFyICpsaWJfcGF0aF9vdXQpIHsKKyAgICBjaGFyICpzdHI7CisgICAgY29uc3QgY2hhciAqbGliX25hbWU7CisgICAgc2l6ZV90IGxlbjsKKworICAgIGlmIChsaWJfcGF0aF9pbiA9PSBOVUxMIHx8IGxpYl9wYXRoX291dCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN0cmxjcHkobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpOworCisgICAgLy8gVHJ5IGV4YWN0IHBhdGggZmlyc3QKKyAgICBzdHIgPSBzdHJzdHIobGliX3BhdGhfb3V0LCAiL2xpYi9zb3VuZGZ4LyIpOworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IGxpYnJhcnkgbmFtZSBmcm9tIGlucHV0IHBhdGgKKyAgICBsZW4gPSBzdHIgLSBsaWJfcGF0aF9vdXQ7CisgICAgbGliX25hbWUgPSBsaWJfcGF0aF9pbiArIGxlbiArIHN0cmxlbigiL2xpYi9zb3VuZGZ4LyIpOworCisgICAgLy8gVGhlbiB0cnkgd2l0aCBsaWJyYXJ5IG5hbWUgYW5kIHN0YW5kYXJkIHBhdGggbmFtZXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0xpYnJhcnlQYXRoUm9vdFNpemU7IGkrKykgeworICAgICAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOworCisgICAgICAgIHNucHJpbnRmKHBhdGgsCisgICAgICAgICAgICAgICAgIFBBVEhfTUFYLAorICAgICAgICAgICAgICAgICAiJXMvJXMiLAorICAgICAgICAgICAgICAgICBrTGlicmFyeVBhdGhSb290W2ldLAorICAgICAgICAgICAgICAgICBsaWJfbmFtZSk7CisgICAgICAgIGlmIChGX09LID09IGFjY2VzcyhwYXRoLCAwKSkgeworICAgICAgICAgICAgc3RyY3B5KGxpYl9wYXRoX291dCwgcGF0aCk7CisgICAgICAgICAgICBBTE9HV19JRihzdHJuY21wKGxpYl9wYXRoX291dCwgbGliX3BhdGhfaW4sIFBBVEhfTUFYKSAhPSAwLAorICAgICAgICAgICAgICAgICJjaGVja0xpYnJhcnlQYXRoKCkgY29ycmVjdGVkIGxpYnJhcnkgcGF0aCAlcyB0byAlcyIsIGxpYl9wYXRoX2luLCBsaWJfcGF0aF9vdXQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKKworCitpbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgY25vZGUgKm5vZGU7CisgICAgdm9pZCAqaGRsID0gTlVMTDsKKyAgICBhdWRpb19lZmZlY3RfbGlicmFyeV90ICpkZXNjOworICAgIGxpc3RfZWxlbV90ICplOworICAgIGxpYl9lbnRyeV90ICpsOworICAgIGNoYXIgcGF0aFtQQVRIX01BWF07CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgUEFUSF9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGNoZWNrTGlicmFyeVBhdGgoKGNvbnN0IGNoYXIgKilub2RlLT52YWx1ZSwgcGF0aCkgIT0gMCkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBsaWJyYXJ5ICVzIiwgcGF0aCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaGRsID0gZGxvcGVuKHBhdGgsIFJUTERfTk9XKTsKKyAgICBpZiAoaGRsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgZmFpbGVkIHRvIG9wZW4gJXMiLCBwYXRoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBkZXNjID0gKGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKilkbHN5bShoZGwsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7CisgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBzeW1ib2wgJXMiLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcgIT0gZGVzYy0+dGFnKSB7CisgICAgICAgIEFMT0dXKCJnZXRMaWJyYXJ5KCkgYmFkIHRhZyAlMDh4IGluIGxpYiBpbmZvIHN0cnVjdCIsIGRlc2MtPnRhZyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjLT52ZXJzaW9uKSAhPQorICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OKSkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBiYWQgbGliIHZlcnNpb24gJTA4eCIsIGRlc2MtPnZlcnNpb24pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8vIGFkZCBlbnRyeSBmb3IgbGlicmFyeSBpbiBnTGlicmFyeUxpc3QKKyAgICBsID0gbWFsbG9jKHNpemVvZihsaWJfZW50cnlfdCkpOworICAgIGwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKKyAgICBsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7CisgICAgbC0+aGFuZGxlID0gaGRsOworICAgIGwtPmRlc2MgPSBkZXNjOworICAgIGwtPmVmZmVjdHMgPSBOVUxMOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbC0+bG9jaywgTlVMTCk7CisKKyAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOworICAgIGUtPm9iamVjdCA9IGw7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgZS0+bmV4dCA9IGdMaWJyYXJ5TGlzdDsKKyAgICBnTGlicmFyeUxpc3QgPSBlOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGwsIHBhdGgpOworCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGlmIChoZGwgIT0gTlVMTCkgeworICAgICAgICBkbGNsb3NlKGhkbCk7CisgICAgfQorICAgIC8vYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGVycm9ycyBpbiBnTGlicmFyeUZhaWxlZExpc3QKKyAgICBsaWJfZmFpbGVkX2VudHJ5X3QgKmZsID0gbWFsbG9jKHNpemVvZihsaWJfZmFpbGVkX2VudHJ5X3QpKTsKKyAgICBmbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOworICAgIGZsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7CisKKyAgICBsaXN0X2VsZW1fdCAqZmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZmUtPm9iamVjdCA9IGZsOworICAgIGZlLT5uZXh0ID0gZ0xpYnJhcnlGYWlsZWRMaXN0OworICAgIGdMaWJyYXJ5RmFpbGVkTGlzdCA9IGZlOworICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGVycm9yIGluIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBmbCwgcGF0aCk7CisKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworLy8gVGhpcyB3aWxsIGZpbmQgdGhlIGxpYnJhcnkgYW5kIFVVSUQgdGFncyBvZiB0aGUgc3ViIGVmZmVjdCBwb2ludGVkIGJ5IHRoZQorLy8gbm9kZSwgZ2V0cyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IgYW5kIGxpYl9lbnRyeV90IGFuZCBhZGRzIHRoZSBzdWJlZmZlY3QgLQorLy8gc3ViX2VudHJ5X3QgdG8gdGhlIGdTdWJFZmZlY3RMaXN0CitpbnQgYWRkU3ViRWZmZWN0KGNub2RlICpyb290KQoreworICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QiKTsKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKKyAgICBsaWJfZW50cnlfdCAqbDsKKyAgICBsaXN0X2VsZW1fdCAqZTsKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKKyAgICBpZiAobCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7CisgICAgICAgIGNoYXIgc1s0MF07CisgICAgICAgIHV1aWRUb1N0cmluZygmdXVpZCwgcywgNDApOworICAgICAgICBBTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisjaWYgKExPR19OREVCVUc9PTApCisgICAgY2hhciBzWzUxMl07CisgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CisjZW5kaWYKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViX2VmZmVjdCA9IG1hbGxvYyhzaXplb2Yoc3ViX2VmZmVjdF9lbnRyeV90KSk7CisgICAgc3ViX2VmZmVjdC0+b2JqZWN0ID0gZDsKKyAgICAvLyBsaWJfZW50cnlfdCBpcyBzdG9yZWQgc2luY2UgdGhlIHN1YiBlZmZlY3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBsaWJyYXJ5CisgICAgc3ViX2VmZmVjdC0+bGliID0gbDsKKyAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOworICAgIGUtPm9iamVjdCA9IHN1Yl9lZmZlY3Q7CisgICAgZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbTsKKyAgICBnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0gPSBlOworICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QgZW5kIik7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGxvYWRFZmZlY3Qobm9kZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGU7CisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGxpYl9lbnRyeV90ICpsOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQ7CisgICAgbGlzdF9lbGVtX3QgKmU7CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOworICAgIGlmIChsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKKyAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBsaWJfZW50cnlfdCAqdG1wOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChmaW5kRWZmZWN0KE5VTEwsICZ1dWlkLCAmdG1wLCBOVUxMKSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJza2lwcGluZyBkdXBsaWNhdGUgdXVpZCAlcyAlcyIsIG5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgIG5vZGUtPm5leHQgPyAiYW5kIGl0cyBzdWItZWZmZWN0cyIgOiAiIik7CisgICAgICAgIHNraXAgPSB0cnVlOworICAgIH0KKworICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKKyAgICAgICAgY2hhciBzWzQwXTsKKyAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7CisgICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7CisgICAgICAgIGZyZWUoZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyNpZiAoTE9HX05ERUJVRz09MCkKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CisjZW5kaWYKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gZDsKKyAgICBpZiAoc2tpcCkgeworICAgICAgICBlLT5uZXh0ID0gZ1NraXBwZWRFZmZlY3RzOworICAgICAgICBnU2tpcHBlZEVmZmVjdHMgPSBlOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9IGVsc2UgeworICAgICAgICBlLT5uZXh0ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgbC0+ZWZmZWN0cyA9IGU7CisgICAgfQorCisgICAgLy8gQWZ0ZXIgdGhlIFVVSUQgbm9kZSBpbiB0aGUgY29uZmlnX3RyZWUsIGlmIG5vZGUtPm5leHQgaXMgdmFsaWQsCisgICAgLy8gdGhhdCB3b3VsZCBiZSBzdWIgZWZmZWN0IG5vZGUuCisgICAgLy8gRmluZCB0aGUgc3ViIGVmZmVjdHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAorICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIGludCBjb3VudCA9IDI7CisgICAgYm9vbCBod1N1YmVmeCA9IGZhbHNlLCBzd1N1YmVmeCA9IGZhbHNlOworICAgIGxpc3Rfc3ViX2VsZW1fdCAqc3ViZSA9IE5VTEw7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBBTE9HVigiQWRkaW5nIHRoZSBlZmZlY3QgdG8gZ0VmZmVjdFN1Ykxpc3QgYXMgdGhlcmUgYXJlIHN1YiBlZmZlY3RzIik7CisgICAgICAgIHN1YmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3Rfc3ViX2VsZW1fdCkpOworICAgICAgICBzdWJlLT5vYmplY3QgPSBkOworICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7CisgICAgICAgIHN1YmUtPm5leHQgPSBnU3ViRWZmZWN0TGlzdDsKKyAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlOworICAgIH0KKyAgICB3aGlsZSAobm9kZSAhPSBOVUxMICYmIGNvdW50KSB7CisgICAgICAgaWYgKGFkZFN1YkVmZmVjdChub2RlKSkgeworICAgICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBhZGQgc3ViRWZmZWN0ICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGdTdWJFZmZlY3RMaXN0IHRvIHBvaW50IHRvIG9sZGVyIGxpc3Q7CisgICAgICAgICAgIGdTdWJFZmZlY3RMaXN0ID0gc3ViZS0+bmV4dDsKKyAgICAgICAgICAgZnJlZShzdWJlLT5zdWJfZWxlbSk7Ly8gRnJlZSBhbiBhbHJlYWR5IGFkZGVkIHN1YiBlZmZlY3QKKyAgICAgICAgICAgc3ViZS0+c3ViX2VsZW0gPSBOVUxMOworICAgICAgICAgICBmcmVlKHN1YmUpOworICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICAgICB9CisgICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJFbnRyeSA9IChzdWJfZWZmZWN0X2VudHJ5X3QqKWdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbS0+b2JqZWN0OworICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnN1YkVmZmVjdERlc2MgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCopKHN1YkVudHJ5LT5vYmplY3QpOworICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKKyAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9kaW5nCisgICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCB3aXRoIFByb3h5IFVVSUQKKyAgICAgICAvLyBjaGVjayBmb3IgU3cgZGVzYworICAgICAgICBpZiAoISgoc3ViRWZmZWN0RGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSykgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMKSkgeworICAgICAgICAgICAgIHN3U3ViZWZ4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAqZCA9ICpzdWJFZmZlY3REZXNjOworICAgICAgICAgICAgIGQtPnV1aWQgPSB1dWlkOworICAgICAgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgQ2hhbmdlZCB0aGUgUHJveHkgZGVzYyIpOworICAgICAgIH0gZWxzZQorICAgICAgICAgICBod1N1YmVmeCA9IHRydWU7CisgICAgICAgY291bnQtLTsKKyAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgLy8gMSBIVyBhbmQgMSBTVyBzdWIgZWZmZWN0IGZvdW5kLiBTZXQgdGhlIG9mZmxvYWQgZmxhZyBpbiB0aGUgUHJveHkgZGVzYworICAgIGlmIChod1N1YmVmeCAmJiBzd1N1YmVmeCkgeworICAgICAgICBkLT5mbGFncyB8PSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2xpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgbGlzdF9lbGVtX3QgKmU7CisKKyAgICBpZiAoZ0NhY2hlZExpYnJhcnkgJiYKKyAgICAgICAgICAgICFzdHJuY21wKGdDYWNoZWRMaWJyYXJ5LT5uYW1lLCBuYW1lLCBQQVRIX01BWCkpIHsKKyAgICAgICAgcmV0dXJuIGdDYWNoZWRMaWJyYXJ5OworICAgIH0KKworICAgIGUgPSBnTGlicmFyeUxpc3Q7CisgICAgd2hpbGUgKGUpIHsKKyAgICAgICAgbGliX2VudHJ5X3QgKmwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7CisgICAgICAgIGlmICghc3RyY21wKGwtPm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICBnQ2FjaGVkTGlicmFyeSA9IGw7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODI2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUU0NPTkZJR0xPQURFUl9ICisjZGVmaW5lIEFORFJPSURfRUZGRUNUU0NPTkZJR0xPQURFUl9ICisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqIFBhcnNlcyB0aGUgcGxhdGZvcm0gZWZmZWN0IGNvbmZpZ3VyYXRpb24KKyAqIGFuZCBzdG9yZXMgaXRzIGNvbnRlbnQgaW4gdGhlIGdsb2JhbCBFZmZlY3RGYWN0b3J5U3RhdGUuICovCitBTkRST0lEX0FQSQoraW50IEVmZmVjdExvYWRFZmZlY3RDb25maWcoKTsKKworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIEFORFJPSURfRUZGRUNUU0NPTkZJR0xPQURFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCmluZGV4IDM3YzBiYjcuLmNkMGU3NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCkBAIC0xNyw2NSArMTcsNDYgQEAKICNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnkiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgotCi0jaW5jbHVkZSA8ZGxmY24uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisjaW5jbHVkZSAiRWZmZWN0c1htbENvbmZpZ0xvYWRlci5oIgorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnkuaCIKIAogc3RhdGljIGxpc3RfZWxlbV90ICpnRWZmZWN0TGlzdDsgLy8gbGlzdCBvZiBlZmZlY3RfZW50cnlfdDogYWxsIGN1cnJlbnRseSBjcmVhdGVkIGVmZmVjdHMKLXN0YXRpYyBsaXN0X2VsZW1fdCAqZ0xpYnJhcnlMaXN0OyAvLyBsaXN0IG9mIGxpYl9lbnRyeV90OiBhbGwgY3VycmVudGx5IGxvYWRlZCBsaWJyYXJpZXMKLXN0YXRpYyBsaXN0X2VsZW1fdCAqZ1NraXBwZWRFZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdHMgc2tpcHBlZCBiZWNhdXNlIG9mIGR1cGxpY2F0ZSB1dWlkCi0vLyBsaXN0IG9mIGVmZmVjdF9kZXNjcmlwdG9yIGFuZCBsaXN0IG9mIHN1YiBlZmZlY3RzIDogYWxsIGN1cnJlbnRseSBsb2FkZWQKLS8vIEl0IGRvZXMgbm90IGNvbnRhaW4gZWZmZWN0cyB3aXRob3V0IHN1YiBlZmZlY3RzLgotc3RhdGljIGxpc3Rfc3ViX2VsZW1fdCAqZ1N1YkVmZmVjdExpc3Q7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IGdMaWJMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsgLy8gY29udHJvbHMgYWNjZXNzIHRvIGdMaWJyYXJ5TGlzdAogc3RhdGljIHVpbnQzMl90IGdOdW1FZmZlY3RzOyAgICAgICAgIC8vIHRvdGFsIG51bWJlciBudW1iZXIgb2YgZWZmZWN0cwogc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyTGliOyAgICAvLyBjdXJyZW50IGxpYnJhcnkgaW4gZW51bWVyYXRpb24gcHJvY2Vzcwogc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyRWZmZWN0OyAvLyBjdXJyZW50IGVmZmVjdCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCiBzdGF0aWMgdWludDMyX3QgZ0N1ckVmZmVjdElkeDsgICAgICAgLy8gY3VycmVudCBlZmZlY3QgaW5kZXggaW4gZW51bWVyYXRpb24gcHJvY2Vzcwotc3RhdGljIGxpYl9lbnRyeV90ICpnQ2FjaGVkTGlicmFyeTsgIC8vIGxhc3QgbGlicmFyeSBhY2Nlc3NlZCBieSBnZXRMaWJyYXJ5KCkKKy8qKiBOdW1iZXIgb2YgZWxlbWVudHMgc2tpcHBlZCBkdXJpbmcgdGhlIGVmZmVjdHMgY29uZmlndXJhdGlvbiBsb2FkaW5nLgorICogIC0xIGlmIHRoZSBjb25maWcgbG9hZGVyIGZhaWxlZAorICogIC0yIGlmIGNvbmZpZyBsb2FkIHdhcyBza2lwcGVkCisgKi8KK3N0YXRpYyBzc2l6ZV90IGdDb25maWdOYkVsZW1Ta2lwcGVkID0gLTI7CiAKIHN0YXRpYyBpbnQgZ0luaXREb25lOyAvLyB0cnVlIGlzIGdsb2JhbCBpbml0aWFsaXphdGlvbiBoYXMgYmVlbiBwcmVmb3JtZWQKIHN0YXRpYyBpbnQgZ0NhblF1ZXJ5RWZmZWN0OyAvLyBpbmRpY2F0ZXMgdGhhdCBjYWxsIHRvIEVmZmVjdFF1ZXJ5RWZmZWN0KCkgaXMgdmFsaWQsIGkuZS4gdGhhdCB0aGUgbGlzdCBvZiBlZmZlY3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBub3QgbW9kaWZpZWQgc2luY2UgbGFzdCBjYWxsIHRvIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpCi0KLXN0YXRpYyBsaXN0X2VsZW1fdCAqZ0xpYnJhcnlGYWlsZWRMaXN0OyAgLy9saXN0IG9mIGxpYl9mYWlsZWRfZW50cnlfdDogbGlicmFyaWVzIGZhaWxlZCB0byBsb2FkCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vICAgICAgTG9jYWwgZnVuY3Rpb25zIHByb3RvdHlwZXMKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RhdGljIGludCBpbml0KCk7Ci1zdGF0aWMgaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwotc3RhdGljIGludCBsb2FkTGlicmFyaWVzKGNub2RlICpyb290KTsKLXN0YXRpYyBpbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpOwotc3RhdGljIGludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCk7Ci1zdGF0aWMgaW50IGxvYWRFZmZlY3QoY25vZGUgKm5vZGUpOwotLy8gVG8gZ2V0IGFuZCBhZGQgdGhlIGVmZmVjdCBwb2ludGVkIGJ5IHRoZSBwYXNzZWQgbm9kZSB0byB0aGUgZ1N1YkVmZmVjdExpc3QKLXN0YXRpYyBpbnQgYWRkU3ViRWZmZWN0KGNub2RlICpyb290KTsKLXN0YXRpYyBsaWJfZW50cnlfdCAqZ2V0TGlicmFyeShjb25zdCBjaGFyICpwYXRoKTsKIHN0YXRpYyB2b2lkIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKTsKIHN0YXRpYyB1aW50MzJfdCB1cGRhdGVOdW1FZmZlY3RzKCk7Ci1zdGF0aWMgaW50IGZpbmRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKLSAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKIC8vIFRvIHNlYXJjaCBhIHN1YmVmZmVjdCBpbiB0aGUgZ1N1YkVmZmVjdExpc3QKIHN0YXRpYyBpbnQgZmluZFN1YkVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCiAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYyk7Ci1zdGF0aWMgdm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpOwotc3RhdGljIGludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKTsKLXN0YXRpYyBpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vICAgICAgRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIGZ1bmN0aW9ucwpAQCAtNDYxLDEwICs0NDIsMTIgQEAKICAgICBpZiAoaWdub3JlRnhDb25mRmlsZXMpIHsKICAgICAgICAgQUxPR0koIkF1ZGlvIGVmZmVjdHMgaW4gY29uZmlndXJhdGlvbiBmaWxlcyB3aWxsIGJlIGlnbm9yZWQiKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOwotICAgICAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOworICAgICAgICBnQ29uZmlnTmJFbGVtU2tpcHBlZCA9IEVmZmVjdExvYWRYbWxFZmZlY3RDb25maWcoTlVMTCk7CisgICAgICAgIGlmIChnQ29uZmlnTmJFbGVtU2tpcHBlZCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gbG9hZCBYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24sIGZhbGxiYWNrIHRvIC5jb25mIik7CisgICAgICAgICAgICBFZmZlY3RMb2FkRWZmZWN0Q29uZmlnKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZ0NvbmZpZ05iRWxlbVNraXBwZWQgPiAwKSB7CisgICAgICAgICAgICBBTE9HRSgiRWZmZWN0IGNvbmZpZyBpcyBwYXJ0aWFsbHkgaW52YWxpZCwgc2tpcHBlZCAlemQgZWxlbWVudHMiLCBnQ29uZmlnTmJFbGVtU2tpcHBlZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ3NCwzNjcgKzQ1Nyw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKQotewotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBkYXRhID0gbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotICAgIGxvYWRMaWJyYXJpZXMocm9vdCk7Ci0gICAgbG9hZEVmZmVjdHMocm9vdCk7Ci0gICAgY29uZmlnX2ZyZWUocm9vdCk7Ci0gICAgZnJlZShyb290KTsKLSAgICBmcmVlKGRhdGEpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2FkTGlicmFyaWVzKGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlOwotCi0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUklFU19UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBsb2FkTGlicmFyeShub2RlLCBub2RlLT5uYW1lKTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jaWZkZWYgX19MUDY0X18KLS8vIGF1ZGlvX2VmZmVjdHMuY29uZiBhbHdheXMgc3BlY2lmaWVzIDMyIGJpdCBsaWIgcGF0aDogY29udmVydCB0byA2NCBiaXQgcGF0aCBpZiBuZWVkZWQKLXN0YXRpYyBjb25zdCBjaGFyICprTGlicmFyeVBhdGhSb290W10gPQotICAgICAgICB7Ii9vZG0vbGliNjQvc291bmRmeCIsICIvdmVuZG9yL2xpYjY0L3NvdW5kZngiLCAiL3N5c3RlbS9saWI2NC9zb3VuZGZ4In07Ci0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgKmtMaWJyYXJ5UGF0aFJvb3RbXSA9Ci0gICAgICAgIHsiL29kbS9saWIvc291bmRmeCIsICIvdmVuZG9yL2xpYi9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliL3NvdW5kZngifTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgaW50IGtMaWJyYXJ5UGF0aFJvb3RTaXplID0KLSAgICAgICAgKHNpemVvZihrTGlicmFyeVBhdGhSb290KSAvIHNpemVvZihrTGlicmFyeVBhdGhSb290WzBdKSk7Ci0KLS8vIENoZWNrcyBpZiB0aGUgbGlicmFyeSBwYXRoIHBhc3NlZCBhcyBsaWJfcGF0aF9pbiBjYW4gYmUgb3BlbmVkIGFuZCBpZiBub3QKLS8vIHRyaWVzIGluIHN0YW5kYXJkIGVmZmVjdCBsaWJyYXJ5IGRpcmVjdG9yaWVzIHdpdGgganVzdCB0aGUgbGlicmFyeSBuYW1lIGFuZCByZXR1cm5zIGNvcnJlY3QgcGF0aAotLy8gaW4gbGliX3BhdGhfb3V0Ci1pbnQgY2hlY2tMaWJyYXJ5UGF0aChjb25zdCBjaGFyICpsaWJfcGF0aF9pbiwgY2hhciAqbGliX3BhdGhfb3V0KSB7Ci0gICAgY2hhciAqc3RyOwotICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lOwotICAgIHNpemVfdCBsZW47Ci0KLSAgICBpZiAobGliX3BhdGhfaW4gPT0gTlVMTCB8fCBsaWJfcGF0aF9vdXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBzdHJsY3B5KGxpYl9wYXRoX291dCwgbGliX3BhdGhfaW4sIFBBVEhfTUFYKTsKLQotICAgIC8vIFRyeSBleGFjdCBwYXRoIGZpcnN0Ci0gICAgc3RyID0gc3Ryc3RyKGxpYl9wYXRoX291dCwgIi9saWIvc291bmRmeC8iKTsKLSAgICBpZiAoc3RyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgLy8gRXh0cmFjdCBsaWJyYXJ5IG5hbWUgZnJvbSBpbnB1dCBwYXRoCi0gICAgbGVuID0gc3RyIC0gbGliX3BhdGhfb3V0OwotICAgIGxpYl9uYW1lID0gbGliX3BhdGhfaW4gKyBsZW4gKyBzdHJsZW4oIi9saWIvc291bmRmeC8iKTsKLQotICAgIC8vIFRoZW4gdHJ5IHdpdGggbGlicmFyeSBuYW1lIGFuZCBzdGFuZGFyZCBwYXRoIG5hbWVzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtMaWJyYXJ5UGF0aFJvb3RTaXplOyBpKyspIHsKLSAgICAgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKLQotICAgICAgICBzbnByaW50ZihwYXRoLAotICAgICAgICAgICAgICAgICBQQVRIX01BWCwKLSAgICAgICAgICAgICAgICAgIiVzLyVzIiwKLSAgICAgICAgICAgICAgICAga0xpYnJhcnlQYXRoUm9vdFtpXSwKLSAgICAgICAgICAgICAgICAgbGliX25hbWUpOwotICAgICAgICBpZiAoRl9PSyA9PSBhY2Nlc3MocGF0aCwgMCkpIHsKLSAgICAgICAgICAgIHN0cmNweShsaWJfcGF0aF9vdXQsIHBhdGgpOwotICAgICAgICAgICAgQUxPR1dfSUYoc3RybmNtcChsaWJfcGF0aF9vdXQsIGxpYl9wYXRoX2luLCBQQVRIX01BWCkgIT0gMCwKLSAgICAgICAgICAgICAgICAiY2hlY2tMaWJyYXJ5UGF0aCgpIGNvcnJlY3RlZCBsaWJyYXJ5IHBhdGggJXMgdG8gJXMiLCBsaWJfcGF0aF9pbiwgbGliX3BhdGhfb3V0KTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi0KLQotaW50IGxvYWRMaWJyYXJ5KGNub2RlICpyb290LCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIGNub2RlICpub2RlOwotICAgIHZvaWQgKmhkbCA9IE5VTEw7Ci0gICAgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqZGVzYzsKLSAgICBsaXN0X2VsZW1fdCAqZTsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOwotCi0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFBBVEhfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChjaGVja0xpYnJhcnlQYXRoKChjb25zdCBjaGFyICopbm9kZS0+dmFsdWUsIHBhdGgpICE9IDApIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgY291bGQgbm90IGZpbmQgbGlicmFyeSAlcyIsIHBhdGgpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGhkbCA9IGRsb3BlbihwYXRoLCBSVExEX05PVyk7Ci0gICAgaWYgKGhkbCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGZhaWxlZCB0byBvcGVuICVzIiwgcGF0aCk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZGVzYyA9IChhdWRpb19lZmZlY3RfbGlicmFyeV90ICopZGxzeW0oaGRsLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOwotICAgIGlmIChkZXNjID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgY291bGQgbm90IGZpbmQgc3ltYm9sICVzIiwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHICE9IGRlc2MtPnRhZykgewotICAgICAgICBBTE9HVygiZ2V0TGlicmFyeSgpIGJhZCB0YWcgJTA4eCBpbiBsaWIgaW5mbyBzdHJ1Y3QiLCBkZXNjLT50YWcpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZGVzYy0+dmVyc2lvbikgIT0KLSAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTikpIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgYmFkIGxpYiB2ZXJzaW9uICUwOHgiLCBkZXNjLT52ZXJzaW9uKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICAvLyBhZGQgZW50cnkgZm9yIGxpYnJhcnkgaW4gZ0xpYnJhcnlMaXN0Ci0gICAgbCA9IG1hbGxvYyhzaXplb2YobGliX2VudHJ5X3QpKTsKLSAgICBsLT5uYW1lID0gc3RybmR1cChuYW1lLCBQQVRIX01BWCk7Ci0gICAgbC0+cGF0aCA9IHN0cm5kdXAocGF0aCwgUEFUSF9NQVgpOwotICAgIGwtPmhhbmRsZSA9IGhkbDsKLSAgICBsLT5kZXNjID0gZGVzYzsKLSAgICBsLT5lZmZlY3RzID0gTlVMTDsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJmwtPmxvY2ssIE5VTEwpOwotCi0gICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKLSAgICBlLT5vYmplY3QgPSBsOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOwotICAgIGUtPm5leHQgPSBnTGlicmFyeUxpc3Q7Ci0gICAgZ0xpYnJhcnlMaXN0ID0gZTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOwotICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBsLCBwYXRoKTsKLQotICAgIHJldHVybiAwOwotCi1lcnJvcjoKLSAgICBpZiAoaGRsICE9IE5VTEwpIHsKLSAgICAgICAgZGxjbG9zZShoZGwpOwotICAgIH0KLSAgICAvL2FkZCBlbnRyeSBmb3IgbGlicmFyeSBlcnJvcnMgaW4gZ0xpYnJhcnlGYWlsZWRMaXN0Ci0gICAgbGliX2ZhaWxlZF9lbnRyeV90ICpmbCA9IG1hbGxvYyhzaXplb2YobGliX2ZhaWxlZF9lbnRyeV90KSk7Ci0gICAgZmwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKLSAgICBmbC0+cGF0aCA9IHN0cm5kdXAocGF0aCwgUEFUSF9NQVgpOwotCi0gICAgbGlzdF9lbGVtX3QgKmZlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGZlLT5vYmplY3QgPSBmbDsKLSAgICBmZS0+bmV4dCA9IGdMaWJyYXJ5RmFpbGVkTGlzdDsKLSAgICBnTGlicmFyeUZhaWxlZExpc3QgPSBmZTsKLSAgICBBTE9HVigiZ2V0TGlicmFyeSgpIGxpbmtlZCBlcnJvciBpbiBsaWJyYXJ5ICVwIGZvciBwYXRoICVzIiwgZmwsIHBhdGgpOwotCi0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8vIFRoaXMgd2lsbCBmaW5kIHRoZSBsaWJyYXJ5IGFuZCBVVUlEIHRhZ3Mgb2YgdGhlIHN1YiBlZmZlY3QgcG9pbnRlZCBieSB0aGUKLS8vIG5vZGUsIGdldHMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yIGFuZCBsaWJfZW50cnlfdCBhbmQgYWRkcyB0aGUgc3ViZWZmZWN0IC0KLS8vIHN1Yl9lbnRyeV90IHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotaW50IGFkZFN1YkVmZmVjdChjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HVigiYWRkU3ViRWZmZWN0Iik7Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQ7Ci0gICAgbGliX2VudHJ5X3QgKmw7Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUllfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7Ci0gICAgaWYgKGwgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiYWRkU3ViRWZmZWN0KCkgY291bGQgbm90IGdldCBsaWJyYXJ5ICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpZiAoc3RyaW5nVG9VdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gMCkgewotICAgICAgICBBTE9HVygiYWRkU3ViRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgIGlmIChsLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmdXVpZCwgZCkgIT0gMCkgewotICAgICAgICBjaGFyIHNbNDBdOwotICAgICAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHMsIDQwKTsKLSAgICAgICAgQUxPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotI2lmIChMT0dfTkRFQlVHPT0wKQotICAgIGNoYXIgc1s1MTJdOwotICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIHNpemVvZihzKSwgMCAvKiBpbmRlbnQgKi8pOwotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLGQsIHMpOwotI2VuZGlmCi0gICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkLT5hcGlWZXJzaW9uKSAhPQotICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKSkgewotICAgICAgICBBTE9HVygiQmFkIEFQSSB2ZXJzaW9uICUwOHggb24gbGliICVzIiwgZC0+YXBpVmVyc2lvbiwgbC0+bmFtZSk7Ci0gICAgICAgIGZyZWUoZCk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1Yl9lZmZlY3QgPSBtYWxsb2Moc2l6ZW9mKHN1Yl9lZmZlY3RfZW50cnlfdCkpOwotICAgIHN1Yl9lZmZlY3QtPm9iamVjdCA9IGQ7Ci0gICAgLy8gbGliX2VudHJ5X3QgaXMgc3RvcmVkIHNpbmNlIHRoZSBzdWIgZWZmZWN0cyBhcmUgbm90IGxpbmtlZCB0byB0aGUgbGlicmFyeQotICAgIHN1Yl9lZmZlY3QtPmxpYiA9IGw7Ci0gICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKLSAgICBlLT5vYmplY3QgPSBzdWJfZWZmZWN0OwotICAgIGUtPm5leHQgPSBnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW07Ci0gICAgZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtID0gZTsKLSAgICBBTE9HVigiYWRkU3ViRWZmZWN0IGVuZCIpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgRUZGRUNUU19UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBsb2FkRWZmZWN0KG5vZGUpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2FkRWZmZWN0KGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlOwotICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkOwotICAgIGxpc3RfZWxlbV90ICplOwotCi0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUllfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKLSAgICBpZiAobCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGdldCBsaWJyYXJ5ICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgbGliX2VudHJ5X3QgKnRtcDsKLSAgICBib29sIHNraXAgPSBmYWxzZTsKLSAgICBpZiAoZmluZEVmZmVjdChOVUxMLCAmdXVpZCwgJnRtcCwgTlVMTCkgPT0gMCkgewotICAgICAgICBBTE9HVygic2tpcHBpbmcgZHVwbGljYXRlIHV1aWQgJXMgJXMiLCBub2RlLT52YWx1ZSwKLSAgICAgICAgICAgICAgICBub2RlLT5uZXh0ID8gImFuZCBpdHMgc3ViLWVmZmVjdHMiIDogIiIpOwotICAgICAgICBza2lwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7Ci0gICAgICAgIGNoYXIgc1s0MF07Ci0gICAgICAgIHV1aWRUb1N0cmluZygmdXVpZCwgcywgNDApOwotICAgICAgICBBTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOwotICAgICAgICBmcmVlKGQpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0jaWYgKExPR19OREVCVUc9PTApCi0gICAgY2hhciBzWzUxMl07Ci0gICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7Ci0gICAgQUxPR1YoImxvYWRFZmZlY3QoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLGQsIHMpOwotI2VuZGlmCi0gICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkLT5hcGlWZXJzaW9uKSAhPQotICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKSkgewotICAgICAgICBBTE9HVygiQmFkIEFQSSB2ZXJzaW9uICUwOHggb24gbGliICVzIiwgZC0+YXBpVmVyc2lvbiwgbC0+bmFtZSk7Ci0gICAgICAgIGZyZWUoZCk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IGQ7Ci0gICAgaWYgKHNraXApIHsKLSAgICAgICAgZS0+bmV4dCA9IGdTa2lwcGVkRWZmZWN0czsKLSAgICAgICAgZ1NraXBwZWRFZmZlY3RzID0gZTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZS0+bmV4dCA9IGwtPmVmZmVjdHM7Ci0gICAgICAgIGwtPmVmZmVjdHMgPSBlOwotICAgIH0KLQotICAgIC8vIEFmdGVyIHRoZSBVVUlEIG5vZGUgaW4gdGhlIGNvbmZpZ190cmVlLCBpZiBub2RlLT5uZXh0IGlzIHZhbGlkLAotICAgIC8vIHRoYXQgd291bGQgYmUgc3ViIGVmZmVjdCBub2RlLgotICAgIC8vIEZpbmQgdGhlIHN1YiBlZmZlY3RzIGFuZCBhZGQgdGhlbSB0byB0aGUgZ1N1YkVmZmVjdExpc3QKLSAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICBpbnQgY291bnQgPSAyOwotICAgIGJvb2wgaHdTdWJlZnggPSBmYWxzZSwgc3dTdWJlZnggPSBmYWxzZTsKLSAgICBsaXN0X3N1Yl9lbGVtX3QgKnN1YmUgPSBOVUxMOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIkFkZGluZyB0aGUgZWZmZWN0IHRvIGdFZmZlY3RTdWJMaXN0IGFzIHRoZXJlIGFyZSBzdWIgZWZmZWN0cyIpOwotICAgICAgICBzdWJlID0gbWFsbG9jKHNpemVvZihsaXN0X3N1Yl9lbGVtX3QpKTsKLSAgICAgICAgc3ViZS0+b2JqZWN0ID0gZDsKLSAgICAgICAgc3ViZS0+c3ViX2VsZW0gPSBOVUxMOwotICAgICAgICBzdWJlLT5uZXh0ID0gZ1N1YkVmZmVjdExpc3Q7Ci0gICAgICAgIGdTdWJFZmZlY3RMaXN0ID0gc3ViZTsKLSAgICB9Ci0gICAgd2hpbGUgKG5vZGUgIT0gTlVMTCAmJiBjb3VudCkgewotICAgICAgIGlmIChhZGRTdWJFZmZlY3Qobm9kZSkpIHsKLSAgICAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgYWRkIHN1YkVmZmVjdCAlcyIsIG5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBnU3ViRWZmZWN0TGlzdCB0byBwb2ludCB0byBvbGRlciBsaXN0OwotICAgICAgICAgICBnU3ViRWZmZWN0TGlzdCA9IHN1YmUtPm5leHQ7Ci0gICAgICAgICAgIGZyZWUoc3ViZS0+c3ViX2VsZW0pOy8vIEZyZWUgYW4gYWxyZWFkeSBhZGRlZCBzdWIgZWZmZWN0Ci0gICAgICAgICAgIHN1YmUtPnN1Yl9lbGVtID0gTlVMTDsKLSAgICAgICAgICAgZnJlZShzdWJlKTsKLSAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgICAgfQotICAgICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViRW50cnkgPSAoc3ViX2VmZmVjdF9lbnRyeV90KilnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0tPm9iamVjdDsKLSAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpzdWJFZmZlY3REZXNjID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QqKShzdWJFbnRyeS0+b2JqZWN0KTsKLSAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCi0gICAgICAgLy8gZ2V0X2Rlc2NyaXB0b3IgY2FsbCx3ZSByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlc3BvZGluZwotICAgICAgIC8vIHN3IGVmZmVjdCBkZXNjcmlwdG9yLCBidXQgd2l0aCBQcm94eSBVVUlECi0gICAgICAgLy8gY2hlY2sgZm9yIFN3IGRlc2MKLSAgICAgICAgaWYgKCEoKHN1YkVmZmVjdERlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0spID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTCkpIHsKLSAgICAgICAgICAgICBzd1N1YmVmeCA9IHRydWU7Ci0gICAgICAgICAgICAgKmQgPSAqc3ViRWZmZWN0RGVzYzsKLSAgICAgICAgICAgICBkLT51dWlkID0gdXVpZDsKLSAgICAgICAgICAgICBBTE9HVigibG9hZEVmZmVjdCgpIENoYW5nZWQgdGhlIFByb3h5IGRlc2MiKTsKLSAgICAgICB9IGVsc2UKLSAgICAgICAgICAgaHdTdWJlZnggPSB0cnVlOwotICAgICAgIGNvdW50LS07Ci0gICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIC8vIDEgSFcgYW5kIDEgU1cgc3ViIGVmZmVjdCBmb3VuZC4gU2V0IHRoZSBvZmZsb2FkIGZsYWcgaW4gdGhlIFByb3h5IGRlc2MKLSAgICBpZiAoaHdTdWJlZnggJiYgc3dTdWJlZngpIHsKLSAgICAgICAgZC0+ZmxhZ3MgfD0gRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiAvLyBTZWFyY2hlcyB0aGUgc3ViIGVmZmVjdCBtYXRjaGluZyB0byB0aGUgc3BlY2lmaWVkIHV1aWQKIC8vIGluIHRoZSBnU3ViRWZmZWN0TGlzdC4gSXQgZ2V0cyB0aGUgbGliX2VudHJ5X3QgZm9yCiAvLyB0aGUgbWF0Y2hlZCBzdWJfZWZmZWN0IC4gVXNlZCBpbiBFZmZlY3RDcmVhdGUgb2Ygc3ViIGVmZmVjdHMKQEAgLTg4MSwyOSArNTAzLDYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1saWJfZW50cnlfdCAqZ2V0TGlicmFyeShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGxpc3RfZWxlbV90ICplOwotCi0gICAgaWYgKGdDYWNoZWRMaWJyYXJ5ICYmCi0gICAgICAgICAgICAhc3RybmNtcChnQ2FjaGVkTGlicmFyeS0+bmFtZSwgbmFtZSwgUEFUSF9NQVgpKSB7Ci0gICAgICAgIHJldHVybiBnQ2FjaGVkTGlicmFyeTsKLSAgICB9Ci0KLSAgICBlID0gZ0xpYnJhcnlMaXN0OwotICAgIHdoaWxlIChlKSB7Ci0gICAgICAgIGxpYl9lbnRyeV90ICpsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OwotICAgICAgICBpZiAoIXN0cmNtcChsLT5uYW1lLCBuYW1lKSkgewotICAgICAgICAgICAgZ0NhY2hlZExpYnJhcnkgPSBsOwotICAgICAgICAgICAgcmV0dXJuIGw7Ci0gICAgICAgIH0KLSAgICAgICAgZSA9IGUtPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQogdm9pZCByZXNldEVmZmVjdEVudW1lcmF0aW9uKCkKIHsKICAgICBnQ3VyTGliID0gZ0xpYnJhcnlMaXN0OwpAQCAtOTM1LDExNCArNTM0LDYgQEAKICAgICByZXR1cm4gY250OwogfQogCi1pbnQgZmluZEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAotICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpCi17Ci0gICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7Ci0gICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOwotICAgIGludCBmb3VuZCA9IDA7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICB3aGlsZSAoZSAmJiAhZm91bmQpIHsKLSAgICAgICAgbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKLSAgICAgICAgbGlzdF9lbGVtX3QgKmVmeCA9IGwtPmVmZmVjdHM7Ci0gICAgICAgIHdoaWxlIChlZngpIHsKLSAgICAgICAgICAgIGQgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKWVmeC0+b2JqZWN0OwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnR5cGUsIHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1dWlkICE9IE5VTEwgJiYgbWVtY21wKCZkLT51dWlkLCB1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZnggPSBlZngtPm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZSA9IGUtPm5leHQ7Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgQUxPR1YoImZpbmRFZmZlY3QoKSBlZmZlY3Qgbm90IGZvdW5kIik7Ci0gICAgICAgIHJldCA9IC1FTk9FTlQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImZpbmRFZmZlY3QoKSBmb3VuZCBlZmZlY3Q6ICVzIGluIGxpYiAlcyIsIGQtPm5hbWUsIGwtPm5hbWUpOwotICAgICAgICAqbGliID0gbDsKLSAgICAgICAgaWYgKGRlc2MpIHsKLSAgICAgICAgICAgICpkZXNjID0gZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgaW5kZW50KSB7Ci0gICAgY2hhciBzWzI1Nl07Ci0gICAgY2hhciBzc1syNTZdOwotICAgIGNoYXIgaWR0W2luZGVudCArIDFdOwotCi0gICAgbWVtc2V0KGlkdCwgJyAnLCBpbmRlbnQpOwotICAgIGlkdFtpbmRlbnRdID0gMDsKLQotICAgIHN0clswXSA9IDA7Ci0KLSAgICBzbnByaW50ZihzLCBzaXplb2YocyksICIlcyVzIC8gJXNcbiIsIGlkdCwgZGVzYy0+bmFtZSwgZGVzYy0+aW1wbGVtZW50b3IpOwotICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOwotCi0gICAgdXVpZFRvU3RyaW5nKCZkZXNjLT51dWlkLCBzLCBzaXplb2YocykpOwotICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFVVSUQ6ICVzXG4iLCBpZHQsIHMpOwotICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKLQotICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dHlwZSwgcywgc2l6ZW9mKHMpKTsKLSAgICBzbnByaW50Zihzcywgc2l6ZW9mKHNzKSwgIiVzICBUWVBFOiAlc1xuIiwgaWR0LCBzKTsKLSAgICBzdHJsY2F0KHN0ciwgc3MsIGxlbik7Ci0KLSAgICBzcHJpbnRmKHMsICIlcyAgYXBpVmVyc2lvbjogJTA4WFxuJXMgIGZsYWdzOiAlMDhYXG4iLCBpZHQsCi0gICAgICAgICAgICBkZXNjLT5hcGlWZXJzaW9uLCBpZHQsIGRlc2MtPmZsYWdzKTsKLSAgICBzdHJsY2F0KHN0ciwgcywgbGVuKTsKLX0KLQotaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpCi17Ci0gICAgaW50IHRtcFsxMF07Ci0KLSAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLSAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgdXVpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07Ci0gICAgdXVpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07Ci0gICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07Ci0gICAgdXVpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOwotICAgIHV1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07Ci0gICAgdXVpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKLSAgICB1dWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOwotICAgIHV1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107Ci0gICAgdXVpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKLSAgICB1dWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKQotewotCi0gICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCi0gICAgICAgICAgICB1dWlkLT50aW1lTG93LAotICAgICAgICAgICAgdXVpZC0+dGltZU1pZCwKLSAgICAgICAgICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24sCi0gICAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbMF0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzFdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVsyXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbM10sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzRdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVs1XSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQogaW50IEVmZmVjdER1bXBFZmZlY3RzKGludCBmZCkgewogICAgIGNoYXIgc1s1MTJdOwogCkBAIC0xMDkyLDYgKzU4MywyMCBAQAogICAgICAgICAgICAgZSA9IGUtPm5leHQ7CiAgICAgICAgIH0KICAgICB9CisgICAgc3dpdGNoIChnQ29uZmlnTmJFbGVtU2tpcHBlZCkgeworICAgIGNhc2UgLTI6CisgICAgICAgIGRwcmludGYoZmQsICJFZmZlY3QgY29uZmlndXJhdGlvbiBsb2FkaW5nIHNraXBwZWQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAtMToKKyAgICAgICAgZHByaW50ZihmZCwgIlhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiBmYWlsZWQgdG8gbG9hZC5cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDA6CisgICAgICAgIGRwcmludGYoZmQsICJYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24gbG9hZGVkIHN1Y2Nlc3NmdWxseS5cbiIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBkcHJpbnRmKGZkLCAiWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uIHBhcnRpYWxseSBsb2FkZWQsIHNraXBwZWQgJXpkIGVsZW1lbnRzLlxuIiwKKyAgICAgICAgICAgICAgICBnQ29uZmlnTmJFbGVtU2tpcHBlZCk7CisgICAgfQogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKaW5kZXggNzJlMDkzMS4uMjlkYmM5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogCiAjaWYgX19jcGx1c3BsdXMKQEAgLTk2LDYgKzk2LDcgQEAKIC8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIHN1YiBlZmZlY3QgZGVzY3JpcHRvcnMuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0R2V0U3ViRWZmZWN0cyhjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqKnBTdWJlLAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2NDAwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5U3RhdGUiCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKyNpbmNsdWRlICJsb2cvbG9nLmgiCisKK2xpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7CitsaXN0X2VsZW1fdCAqZ1NraXBwZWRFZmZlY3RzOworbGlzdF9zdWJfZWxlbV90ICpnU3ViRWZmZWN0TGlzdDsKK3B0aHJlYWRfbXV0ZXhfdCBnTGliTG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK2xpc3RfZWxlbV90ICpnTGlicmFyeUZhaWxlZExpc3Q7ICAvL2xpc3Qgb2YgbGliX2ZhaWxlZF9lbnRyeV90OiBsaWJyYXJpZXMgZmFpbGVkIHRvIGxvYWQKKworCitpbnQgZmluZEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAorICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpCit7CisgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CisgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOworICAgIGludCBmb3VuZCA9IDA7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB3aGlsZSAoZSAmJiAhZm91bmQpIHsKKyAgICAgICAgbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKKyAgICAgICAgbGlzdF9lbGVtX3QgKmVmeCA9IGwtPmVmZmVjdHM7CisgICAgICAgIHdoaWxlIChlZngpIHsKKyAgICAgICAgICAgIGQgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKWVmeC0+b2JqZWN0OworICAgICAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnR5cGUsIHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1dWlkICE9IE5VTEwgJiYgbWVtY21wKCZkLT51dWlkLCB1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZnggPSBlZngtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgZSA9IGUtPm5leHQ7CisgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgQUxPR1YoImZpbmRFZmZlY3QoKSBlZmZlY3Qgbm90IGZvdW5kIik7CisgICAgICAgIHJldCA9IC1FTk9FTlQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoImZpbmRFZmZlY3QoKSBmb3VuZCBlZmZlY3Q6ICVzIGluIGxpYiAlcyIsIGQtPm5hbWUsIGwtPm5hbWUpOworICAgICAgICAqbGliID0gbDsKKyAgICAgICAgaWYgKGRlc2MpIHsKKyAgICAgICAgICAgICpkZXNjID0gZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKQoreworICAgIGludCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHV1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIHV1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIHV1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICB1dWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIHV1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgdXVpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICB1dWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIHV1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgdXVpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbikKK3sKKworICAgIHNucHJpbnRmKHN0ciwgbWF4TGVuLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgdXVpZC0+dGltZUxvdywKKyAgICAgICAgICAgIHV1aWQtPnRpbWVNaWQsCisgICAgICAgICAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uLAorICAgICAgICAgICAgdXVpZC0+Y2xvY2tTZXEsCisgICAgICAgICAgICB1dWlkLT5ub2RlWzBdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVsxXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMl0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzNdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVs0XSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbNV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpIHsKKyAgICBjaGFyIHNbMjU2XTsKKyAgICBjaGFyIHNzWzI1Nl07CisgICAgY2hhciBpZHRbaW5kZW50ICsgMV07CisKKyAgICBtZW1zZXQoaWR0LCAnICcsIGluZGVudCk7CisgICAgaWR0W2luZGVudF0gPSAwOworCisgICAgc3RyWzBdID0gMDsKKworICAgIHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVzJXMgLyAlc1xuIiwgaWR0LCBkZXNjLT5uYW1lLCBkZXNjLT5pbXBsZW1lbnRvcik7CisgICAgc3RybGNhdChzdHIsIHMsIGxlbik7CisKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIHNpemVvZihzKSk7CisgICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVVVJRDogJXNcbiIsIGlkdCwgcyk7CisgICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOworCisgICAgdXVpZFRvU3RyaW5nKCZkZXNjLT50eXBlLCBzLCBzaXplb2YocykpOworICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFRZUEU6ICVzXG4iLCBpZHQsIHMpOworICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKKworICAgIHNwcmludGYocywgIiVzICBhcGlWZXJzaW9uOiAlMDhYXG4lcyAgZmxhZ3M6ICUwOFhcbiIsIGlkdCwKKyAgICAgICAgICAgIGRlc2MtPmFwaVZlcnNpb24sIGlkdCwgZGVzYy0+ZmxhZ3MpOworICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmOTQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllTVEFURV9IXworCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnkuaCIKKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogQGZpbGUgQ29udGFpbnMgdGhlIHN0YXRlIHNoYXJlZCB3aXRoIGNvbmZpZ3VyYXRpb24gbG9hZGVyIG9mIHRoZSBFZmZlY3QgZmFjdG9yeS4KKyAqICAgICAgICBUaGlzIGdsb2JhbCBzdGF0ZSBzaG91bGQgcHJvYmFibHkgYmUgcmVmYWN0b3IgaW4gYSBzdHJ1Y3R1cmUKKyAqICAgICAgICBwcm92aWRlZCBieSB0aGUgY29uZmlnIGxvYWRlciBvbiBFZmZlY3RzRmFjdG9yeSBpbml0LgorICogICAgICAgIFRoaXMgaGVhZGVyIGFsc28gY29udGFpbnMgc29tZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgb24gdGhlIHN0YXRlLgorICovCisKK2V4dGVybiBsaXN0X2VsZW1fdCAqZ0xpYnJhcnlMaXN0OyAvLyBsaXN0IG9mIGxpYl9lbnRyeV90OiBhbGwgY3VycmVudGx5IGxvYWRlZCBsaWJyYXJpZXMKKy8vIGxpc3Qgb2YgZWZmZWN0cyBza2lwcGVkIGJlY2F1c2Ugb2YgZHVwbGljYXRlIHV1aWQgb3IgaW52YWxpZCB2ZXJzaW9uCitleHRlcm4gbGlzdF9lbGVtX3QgKmdTa2lwcGVkRWZmZWN0czsKKy8vIGxpc3Qgb2YgZWZmZWN0X2Rlc2NyaXB0b3IgYW5kIGxpc3Qgb2Ygc3ViIGVmZmVjdHMgOiBhbGwgY3VycmVudGx5IGxvYWRlZAorLy8gSXQgZG9lcyBub3QgY29udGFpbiBlZmZlY3RzIHdpdGhvdXQgc3ViIGVmZmVjdHMuCitleHRlcm4gbGlzdF9zdWJfZWxlbV90ICpnU3ViRWZmZWN0TGlzdDsKK2V4dGVybiBwdGhyZWFkX211dGV4X3QgZ0xpYkxvY2s7IC8vIGNvbnRyb2xzIGFjY2VzcyB0byBnTGlicmFyeUxpc3QKKworZXh0ZXJuIGxpc3RfZWxlbV90ICpnTGlicmFyeUZhaWxlZExpc3Q7ICAvL2xpc3Qgb2YgbGliX2ZhaWxlZF9lbnRyeV90OiBsaWJyYXJpZXMgZmFpbGVkIHRvIGxvYWQKKworCisKK2ludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCisgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYyk7CisKK2ludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKTsKKy8qKiBVc2VkIHRvIGxvZyBVVUlEcyAqLworaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pOworCisvKiogVXNlZCBmb3IgZGVidWdpbmcuICovCit2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCk7CisKKyNpZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllTVEFURV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOGI3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5Q29uZmlnTG9hZGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0NvbmZpZ0xvYWRlci5oIgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKyNpbmNsdWRlICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgbmFtZXNwYWNlIGVmZmVjdHNDb25maWc7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgTG9jYWwgZnVuY3Rpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSB7CisKKy8qKiBTaW1pbGFybHkgdG8gZGxvcGVuLCBsb29rcyBmb3IgdGhlIHByb3ZpZGVkIHBhdGggaW4gTERfRUZGRUNUX0xJQlJBUllfUEFUSC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBmb3VuZCBhbmQgc2V0IHJlc29sdmVkUGF0aCB0byBpdHMgYWJzb2x1dGUgcGF0aC4KKyAqICAgICAgICAgZmFsc2UgaWYgbm90IGZvdW5kCisgKi8KK2Jvb2wgcmVzb2x2ZUxpYnJhcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiByZXNvbHZlZFBhdGgpIHsKKyAgICBmb3IgKGF1dG8qIGxpYnJhcnlEaXJlY3RvcnkgOiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRIKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNhbmRpZGF0ZVBhdGggPSBzdGQ6OnN0cmluZyhsaWJyYXJ5RGlyZWN0b3J5KSArICcvJyArIHBhdGg7CisgICAgICAgIGlmIChhY2Nlc3MoY2FuZGlkYXRlUGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICAqcmVzb2x2ZWRQYXRoID0gc3RkOjptb3ZlKGNhbmRpZGF0ZVBhdGgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiogTG9hZHMgYSBsaWJyYXJ5IGdpdmVuIGl0cyByZWxhdGl2ZSBwYXRoIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBsaWJFbnRyeS4KKyAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzIHdpdGggbGliRW50cnkncyBwYXRoLCBoYW5kbGUgYW5kIGRlc2MgZmlsbGVkCisgKiAgICAgICAgIGZhbHNlIG9uIHN1Y2Nlc3Mgd2l0aCBsaWJFbnRyeSdzIHBhdGggZmlsbGVkIHdpdGggdGhlIHBhdGggb2YgdGhlIGZhaWxlZCBsaWIKKyAqIFRoZSBjYWxsZXIgTVVTVCBmcmVlIHRoZSByZXNvdXJjZXMgcGF0aCAoZnJlZSkgYW5kIGhhbmRsZSAoZGxjbG9zZSkgaWYgZmlsbGVkLgorICovCitib29sIGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIqIHJlbGF0aXZlUGF0aCwgbGliX2VudHJ5X3QqIGxpYkVudHJ5KSBub2V4Y2VwdCB7CisKKyAgICBzdGQ6OnN0cmluZyBhYnNvbHV0ZVBhdGg7CisgICAgaWYgKCFyZXNvbHZlTGlicmFyeShyZWxhdGl2ZVBhdGgsICZhYnNvbHV0ZVBhdGgpKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBsaWJyYXJ5IGluIGVmZmVjdCBkaXJlY3RvcmllczogJXMiLCByZWxhdGl2ZVBhdGgpOworICAgICAgICBsaWJFbnRyeS0+cGF0aCA9IHN0cmR1cChyZWxhdGl2ZVBhdGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IGNoYXIqIHBhdGggPSBhYnNvbHV0ZVBhdGguY19zdHIoKTsKKyAgICBsaWJFbnRyeS0+cGF0aCA9IHN0cmR1cChwYXRoKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGliIGlzIGNsb3NlZCBvbiBlYXJseSByZXR1cm4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoZGxjbG9zZSkqPiBsaWJIYW5kbGUoZGxvcGVuKHBhdGgsIFJUTERfTk9XKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGNsb3NlKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBkbG9wZW4gbGlicmFyeSAlczogJXMiLCBwYXRoLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byogZGVzY3JpcHRpb24gPSBzdGF0aWNfY2FzdDxhdWRpb19lZmZlY3RfbGlicmFyeV90Kj4oCisgICAgICAgICAgZGxzeW0obGliSGFuZGxlLmdldCgpLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpKTsKKyAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBlZmZlY3QgbGlicmFyeSwgZmFpbGVkIG5vdCBmaW5kIHN5bWJvbCAnJXMnIGluICVzOiAlcyIsCisgICAgICAgICAgICAgIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUiwgcGF0aCwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChkZXNjcmlwdGlvbi0+dGFnICE9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRykgeworICAgICAgICBBTE9HRSgiQmFkIHRhZyAlIzA4eCBpbiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUsIGV4cGVjdGVkICUjMDh4IGZvciBsaWJyYXJ5ICVzIiwKKyAgICAgICAgICAgICAgZGVzY3JpcHRpb24tPnRhZywgQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IG1ham9yVmVyc2lvbiA9IEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjcmlwdGlvbi0+dmVyc2lvbik7CisgICAgdWludDMyX3QgZXhwZWN0ZWRNYWpvclZlcnNpb24gPSBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04pOworICAgIGlmIChtYWpvclZlcnNpb24gIT0gZXhwZWN0ZWRNYWpvclZlcnNpb24pIHsKKyAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG1ham9yIHZlcnNpb24gJSMwOHgsIGV4cGVjdGVkICUjMDh4IGZvciBsaWJyYXJ5ICVzIiwKKyAgICAgICAgICAgICAgbWFqb3JWZXJzaW9uLCBleHBlY3RlZE1ham9yVmVyc2lvbiwgcGF0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBsaWJFbnRyeS0+aGFuZGxlID0gbGliSGFuZGxlLnJlbGVhc2UoKTsKKyAgICBsaWJFbnRyeS0+ZGVzYyA9IGRlc2NyaXB0aW9uOworICAgIHJldHVybiB0cnVlOworfQorCisvKiogQmVjYXVzZSB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGRlc3Ryb3llZCBieSBjIGNvZGUsIHVzaW5nIG5ldyB0byBhbGxvY2F0ZSBzaGFyZWQgc3RydWN0dXJlCisgKiBpcyBub3QgcG9zc2libGUuIFByb3ZpZGUgYSBlcXVpdmFsZW50IG9mIHVuaXF1ZV9wdHIgZm9yIG1hbGxvYy9mcmVlZCBzdHJ1Y3R1cmUgdG8gbWFrZSBzdXJlCisgKiB0aGV5IGFyZSBub3QgbGVha2VkIGluIHRoZSBjKysgY29kZS4KKyBAeyAqLworc3RydWN0IEZyZWVEZWxldGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkodm9pZCogcCkgeworICAgICAgICBmcmVlKHApOworICAgIH0KK307CisvKiogdW5pcXVlX3B0ciBmb3Igb2JqZWN0IGNyZWF0ZWQgd2l0aCBtYWxsb2MuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3VzaW5nIFVuaXF1ZUNQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8VCwgRnJlZURlbGV0ZXI+OworCisvKiogYyB2ZXJzaW9uIG9mIHN0ZDo6bWFrZV91bmlxdWUuIFVzZXMgbWFsbG9jIGFuZCBmcmVlLiAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitVbmlxdWVDUHRyPFQ+IG1ha2VVbmlxdWVDKCkgeworICAgIFQqIHB0ciA9IG5ldyAobWFsbG9jKHNpemVvZihUKSkpIFR7fTsgLy8gVXNlIHBsYWNlbWVudCBuZXcgdG8gaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlCisgICAgcmV0dXJuIFVuaXF1ZUNQdHI8VD57cHRyfTsKK30KKworLyoqIEB9ICovCisKKy8qKiBQdXNoIGFuIG5vdCBvd25lZCBlbGVtZW50IGluIGEgbGlzdF9lbGVtIGxpbmsgbGlzdCB3aXRoIGFuIG9wdGlvbmFsIGxvY2suICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgTGlzdEVsZW0+Cit2b2lkIGxpc3RQdXNoKFQqIG9iamVjdCwgTGlzdEVsZW0qKiBsaXN0LCBwdGhyZWFkX211dGV4X3QqIG11dGV4ID0gbnVsbHB0cikgbm9leGNlcHQgeworICAgIGF1dG8gbGlzdEVsZW0gPSBtYWtlVW5pcXVlQzxMaXN0RWxlbT4oKTsKKyAgICBsaXN0RWxlbS0+b2JqZWN0ID0gb2JqZWN0OworICAgIGlmIChtdXRleCAhPSBudWxscHRyKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCk7CisgICAgfQorICAgIGxpc3RFbGVtLT5uZXh0ID0gKmxpc3Q7CisgICAgKmxpc3QgPSBsaXN0RWxlbS5yZWxlYXNlKCk7CisgICAgaWYgKG11dGV4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpOworICAgIH0KK30KKworLyoqIFB1c2ggYW4gb3duZWQgZWxlbWVudCBpbiBhIGxpc3RfZWxlbSBsaW5rIGxpc3Qgd2l0aCBhbiBvcHRpb25hbCBsb2NrLiAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIExpc3RFbGVtPgordm9pZCBsaXN0UHVzaChVbmlxdWVDUHRyPFQ+JiYgb2JqZWN0LCBMaXN0RWxlbSoqIGxpc3QsIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPSBudWxscHRyKSBub2V4Y2VwdCB7CisgICAgbGlzdFB1c2gob2JqZWN0LnJlbGVhc2UoKSwgbGlzdCwgbXV0ZXgpOworfQorCitzaXplX3QgbG9hZExpYnJhcmllcyhjb25zdCBlZmZlY3RzQ29uZmlnOjpMaWJyYXJpZXMmIGxpYnMsCisgICAgICAgICAgICAgICAgICAgICBsaXN0X2VsZW1fdCoqIGxpYkxpc3QsIHB0aHJlYWRfbXV0ZXhfdCogbGliTGlzdExvY2ssCisgICAgICAgICAgICAgICAgICAgICBsaXN0X2VsZW1fdCoqIGxpYkZhaWxlZExpc3QpCit7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQgPSAwOworICAgIGZvciAoYXV0byYgbGlicmFyeSA6IGxpYnMpIHsKKworICAgICAgICAvLyBDb25zdHJ1Y3QgYSBsaWIgZW50cnkKKyAgICAgICAgYXV0byBsaWJFbnRyeSA9IG1ha2VVbmlxdWVDPGxpYl9lbnRyeV90PigpOworICAgICAgICBsaWJFbnRyeS0+bmFtZSA9IHN0cmR1cChsaWJyYXJ5Lm5hbWUuY19zdHIoKSk7CisgICAgICAgIGxpYkVudHJ5LT5lZmZlY3RzID0gbnVsbHB0cjsKKyAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZsaWJFbnRyeS0+bG9jaywgbnVsbHB0cik7CisKKyAgICAgICAgaWYgKCFsb2FkTGlicmFyeShsaWJyYXJ5LnBhdGguY19zdHIoKSwgbGliRW50cnkuZ2V0KCkpKSB7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBsaWJyYXJ5IGxvYWQgZmFpbHVyZQorICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGxpYkVudHJ5KSwgbGliRmFpbGVkTGlzdCk7CisgICAgICAgICAgICArK25iU2tpcHBlZEVsZW1lbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUobGliRW50cnkpLCBsaWJMaXN0LCBsaWJMaXN0TG9jayk7CisgICAgfQorICAgIHJldHVybiBuYlNraXBwZWRFbGVtZW50OworfQorCisvKiogRmluZCBhIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gbGlzdC4gKi8KK2xpYl9lbnRyeV90KiBmaW5kTGlicmFyeShjb25zdCBjaGFyKiBuYW1lLCBsaXN0X2VsZW1fdCogbGlzdCkgeworCisgICAgd2hpbGUgKGxpc3QgIT0gbnVsbHB0cikgeworICAgICAgICBhdXRvKiBvYmplY3QgPSBzdGF0aWNfY2FzdDxsaWJfZW50cnlfdCo+KGxpc3QtPm9iamVjdCk7CisgICAgICAgIGlmIChzdHJjbXAob2JqZWN0LT5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworICAgICAgICB9CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RydWN0IFV1aWRTdHIgeworICAgIC8qKiBMZW5ndGggb2YgYW4gdXVpZCByZXByZXNlbnRlZCBhcyBzdHJpbmcuIEBUT0RPOiB1c2UgYSBjb25zdGFudCBpbnN0ZWFkIG9mIDQwLiAqLworICAgIGNoYXIgYnVmZls0MF07Cit9OworCisvKiogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByb3ZpZGVkIHV1aWQuCisgKiBCeSBub3QgcHJvdmlkaW5nIGFuIG91dHB1dCBidWZmZXIsIGl0IGlzIGltcGxpY2l0bHkgY3JlYXRlZCBpbiB0aGUgY2FsbGVyIGNvbnRleHQuCisgKiBJbiBzdWNoIGNhc2UgdGhlIHJldHVybiBwb2ludGVyIGhhcyB0aGUgc2FtZSBsaWZldGltZSBhcyB0aGUgZXhwcmVzc2lvbiBjb250YWluaW5nIHV1aWRUb1N0cmluZygpCisgKi8KK2NoYXIqIHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkLCBVdWlkU3RyJiYgc3RyID0ge30pIHsKKyAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHN0ci5idWZmLCBzaXplb2Yoc3RyLmJ1ZmYpKTsKKyAgICByZXR1cm4gc3RyLmJ1ZmY7Cit9CisKK3N0cnVjdCBMb2FkRWZmZWN0UmVzdWx0IHsKKyAgICAvKiogdHJ1ZSBpZiB0aGUgZWZmZWN0IGlzIHVzYWJsZSAoYWthLCBleGlzdGluZyBsaWIsIGRlc2MsIHJpZ2h0IHZlcnNpb24sIHVuaXF1ZSB1dWlkKSAqLworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIC8qKiBTZXQgaWYgdGhlIGVmZmVjdCBsaWIgd2FzIGZvdW5kKi8KKyAgICBsaWJfZW50cnlfdCogbGliID0gbnVsbHB0cjsKKyAgICAvLyogU2V0IGlmIHRoZSBkZXNjcmlwdGlvbiB3YXMgc3VjY2Vzc2Z1bHkgcmV0cmlldmVkIGZyb20gdGhlIGxpYiAqLworICAgIFVuaXF1ZUNQdHI8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0RGVzYzsKK307CisKK0xvYWRFZmZlY3RSZXN1bHQgbG9hZEVmZmVjdChjb25zdCBFZmZlY3RJbXBsJiBlZmZlY3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiBsaWJMaXN0KSB7CisgICAgTG9hZEVmZmVjdFJlc3VsdCByZXN1bHQ7CisKKyAgICAvLyBGaW5kIHRoZSBlZmZlY3QgbGlicmFyeQorICAgIHJlc3VsdC5saWIgPSBmaW5kTGlicmFyeShlZmZlY3QubGlicmFyeS0+bmFtZS5jX3N0cigpLCBsaWJMaXN0KTsKKyAgICBpZiAocmVzdWx0LmxpYiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBsaWJyYXJ5ICVzIHRvIGxvYWQgZWZmZWN0ICVzIiwKKyAgICAgICAgICAgICAgZWZmZWN0LmxpYnJhcnktPm5hbWUuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXN1bHQuZWZmZWN0RGVzYyA9IG1ha2VVbmlxdWVDPGVmZmVjdF9kZXNjcmlwdG9yX3Q+KCk7CisKKyAgICAvLyBHZXQgdGhlIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgaWYgKHJlc3VsdC5saWItPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZlZmZlY3QudXVpZCwgcmVzdWx0LmVmZmVjdERlc2MuZ2V0KCkpICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLAorICAgICAgICAgICAgICB1dWlkVG9TdHJpbmcoZWZmZWN0LnV1aWQpLCByZXN1bHQubGliLT5uYW1lKTsKKyAgICAgICAgcmVzdWx0LmVmZmVjdERlc2MucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBEdW1wIGVmZmVjdCBmb3IgZGVidWcKKyNpZiAoTE9HX05ERUJVRz09MCkKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihyZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7CisgICAgQUxPR1YoImxvYWRFZmZlY3QoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLCByZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSwgcyk7CisjZW5kaWYKKworICAgIC8vIENoZWNrIGVmZmVjdCBpcyBzdXBwb3J0ZWQKKyAgICB1aW50MzJfdCBleHBlY3RlZE1ham9yVmVyc2lvbiA9IEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTik7CisgICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihyZXN1bHQuZWZmZWN0RGVzYy0+YXBpVmVyc2lvbikgIT0gZXhwZWN0ZWRNYWpvclZlcnNpb24pIHsKKyAgICAgICAgQUxPR0UoIkJhZCBBUEkgdmVyc2lvbiAlIzA4eCBmb3IgZWZmZWN0ICVzIGluIGxpYiAlcywgZXhwZWN0ZWQgbWFqb3IgJSMwOHgiLAorICAgICAgICAgICAgICByZXN1bHQuZWZmZWN0RGVzYy0+YXBpVmVyc2lvbiwgbmFtZS5jX3N0cigpLCByZXN1bHQubGliLT5uYW1lLCBleHBlY3RlZE1ham9yVmVyc2lvbik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgbGliX2VudHJ5X3QgKl87CisgICAgaWYgKGZpbmRFZmZlY3QobnVsbHB0ciwgJmVmZmVjdC51dWlkLCAmXywgbnVsbHB0cikgPT0gMCkgeworICAgICAgICBBTE9HRSgiRWZmZWN0ICVzIHV1aWQgJXMgYWxyZWFkeSBleGlzdCIsIHV1aWRUb1N0cmluZyhlZmZlY3QudXVpZCksIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmVzdWx0LnN1Y2Nlc3MgPSB0cnVlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3NpemVfdCBsb2FkRWZmZWN0cyhjb25zdCBFZmZlY3RzJiBlZmZlY3RzLCBsaXN0X2VsZW1fdCogbGliTGlzdCwgbGlzdF9lbGVtX3QqKiBza2lwcGVkRWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICBsaXN0X3N1Yl9lbGVtX3QqKiBzdWJFZmZlY3RMaXN0KSB7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQgPSAwOworCisgICAgZm9yIChhdXRvJiBlZmZlY3QgOiBlZmZlY3RzKSB7CisKKyAgICAgICAgYXV0byBlZmZlY3RMb2FkUmVzdWx0ID0gbG9hZEVmZmVjdChlZmZlY3QsIGVmZmVjdC5uYW1lLCBsaWJMaXN0KTsKKyAgICAgICAgaWYgKCFlZmZlY3RMb2FkUmVzdWx0LnN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIGlmIChlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MpLCBza2lwcGVkRWZmZWN0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK25iU2tpcHBlZEVsZW1lbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlZmZlY3QuaXNQcm94eSkgeworICAgICAgICAgICAgYXV0byBzd0VmZmVjdExvYWRSZXN1bHQgPSBsb2FkRWZmZWN0KGVmZmVjdC5saWJTdywgZWZmZWN0Lm5hbWUgKyAiIGxpYnN3IiwgbGliTGlzdCk7CisgICAgICAgICAgICBhdXRvIGh3RWZmZWN0TG9hZFJlc3VsdCA9IGxvYWRFZmZlY3QoZWZmZWN0LmxpYkh3LCBlZmZlY3QubmFtZSArICIgbGliaHciLCBsaWJMaXN0KTsKKyAgICAgICAgICAgIGlmICghc3dFZmZlY3RMb2FkUmVzdWx0LnN1Y2Nlc3MgfHwgIWh3RWZmZWN0TG9hZFJlc3VsdC5zdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgbWFpbiBlZmZlY3QgaW4gdGhlIHNraXBwZWQgbGlzdCBldmVuIGlmIG9ubHkgYSBzdWJlZmZlY3QgaXMgaW52YWxpZAorICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBtYWluIGVmZmVjdCBpcyBub3QgdXNhYmxlIHdpdGhvdXQgaXRzIHN1YmVmZmVjdHMuCisgICAgICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyksIHNraXBwZWRFZmZlY3RzKTsKKyAgICAgICAgICAgICAgICArK25iU2tpcHBlZEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0UHVzaChlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MuZ2V0KCksIHN1YkVmZmVjdExpc3QpOworCisgICAgICAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCisgICAgICAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLCB3ZSByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIC8vIHN3IGVmZmVjdCBkZXNjcmlwdG9yLCBidXQga2VlcCB0aGUgUHJveHkgVVVJRAorICAgICAgICAgICAgKmVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyA9ICpzd0VmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYzsKKyAgICAgICAgICAgIGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy0+dXVpZCA9IGVmZmVjdC51dWlkOworCisgICAgICAgICAgICBlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MtPmZsYWdzIHw9IEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEOworCisgICAgICAgICAgICBhdXRvIHJlZ2lzdGVyU3ViRWZmZWN0ID0gW3N1YkVmZmVjdExpc3RdKGF1dG8mJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGVudHJ5ID0gbWFrZVVuaXF1ZUM8c3ViX2VmZmVjdF9lbnRyeV90PigpOworICAgICAgICAgICAgICAgIGVudHJ5LT5vYmplY3QgPSByZXN1bHQuZWZmZWN0RGVzYy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgLy8gbGliX2VudHJ5X3QgaXMgc3RvcmVkIHNpbmNlIHRoZSBzdWIgZWZmZWN0cyBhcmUgbm90IGxpbmtlZCB0byB0aGUgbGlicmFyeQorICAgICAgICAgICAgICAgIGVudHJ5LT5saWIgPSByZXN1bHQubGliOworICAgICAgICAgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShlbnRyeSksICYoKnN1YkVmZmVjdExpc3QpLT5zdWJfZWxlbSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcmVnaXN0ZXJTdWJFZmZlY3Qoc3RkOjptb3ZlKHN3RWZmZWN0TG9hZFJlc3VsdCkpOworICAgICAgICAgICAgcmVnaXN0ZXJTdWJFZmZlY3Qoc3RkOjptb3ZlKGh3RWZmZWN0TG9hZFJlc3VsdCkpOworICAgICAgICB9CisKKyAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyksICZlZmZlY3RMb2FkUmVzdWx0LmxpYi0+ZWZmZWN0cyk7CisgICAgfQorICAgIHJldHVybiBuYlNraXBwZWRFbGVtZW50OworfQorCit9IC8vIG5hbWVzcGFjZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgIEludGVyZmFjZSBmdW5jdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitleHRlcm4gIkMiIHNzaXplX3QgRWZmZWN0TG9hZFhtbEVmZmVjdENvbmZpZyhjb25zdCBjaGFyKiBwYXRoKQoreworICAgIHVzaW5nIGVmZmVjdHNDb25maWc6OnBhcnNlOworICAgIGF1dG8gcmVzdWx0ID0gcGF0aCA/IHBhcnNlKHBhdGgpIDogcGFyc2UoKTsKKyAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgWE1MIGNvbmZpZ3VyYXRpb24gZmlsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICs9IGxvYWRMaWJyYXJpZXMocmVzdWx0LnBhcnNlZENvbmZpZy0+bGlicmFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdMaWJyYXJ5TGlzdCwgJmdMaWJMb2NrLCAmZ0xpYnJhcnlGYWlsZWRMaXN0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEVmZmVjdHMocmVzdWx0LnBhcnNlZENvbmZpZy0+ZWZmZWN0cywgZ0xpYnJhcnlMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnU2tpcHBlZEVmZmVjdHMsICZnU3ViRWZmZWN0TGlzdCk7CisKKyAgICBBTE9HRV9JRihyZXN1bHQubmJTa2lwcGVkRWxlbWVudCAhPSAwLCAiJXp1IGVycm9ycyBkdXJpbmcgbG9hZGluZyBvZiBjb25maWd1cmF0aW9uOiAlcyIsCisgICAgICAgICAgICAgcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQsIHBhdGggPzogZWZmZWN0c0NvbmZpZzo6REVGQVVMVF9QQVRIKTsKKworICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmZTlhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTWE1MQ09ORklHTE9BREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTWE1MQ09ORklHTE9BREVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFBhcnNlcyB0aGUgcGxhdGZvcm0gZWZmZWN0IHhtbCBjb25maWd1cmF0aW9uIGFuZCBzdG9yZXMgaXRzIGNvbnRlbnQgaW4gRWZmZWN0RmFjdG9yeVN0YXRlLgorICogQHBhcmFtW2luXSBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgb3IgTlVMTMKgdG8gbG9hZCB0aGUgZGVmYXVsdCBvbmUKKyAqIEByZXR1cm4gLTHCoG9uIHVucmVjb3ZlcmFibGUgZXJyb3IgKGVnOiBubyBjb25maWd1cmF0aW9uIGZpbGUpCisgKiAgICAgICAgIDAgb24gc3VjY2VzcworICogICAgICAgICB0aGUgbnVtYmVyIG9mIGludmFsaWQgZWxlbWVudHMgKGxpYiAmIGVmZmVjdCkgc2tpcHBlZCBpZiB0aGUgY29uZmlnIGlzIHBhcnRpYWxseSBpbnZhbGlkCisgKiBAbm90ZSB0aGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciB0ZXN0IHB1cnBvc2Ugb25seS4gRG8gbm90IGNhbGwgZnJvbSBvdXRzaWRlIHRoaXMgbGlicmFyeS4KKyAqLworQU5EUk9JRF9BUEkKK3NzaXplX3QgRWZmZWN0TG9hZFhtbEVmZmVjdENvbmZpZyhjb25zdCBjaGFyKiBwYXRoKTsKKworI2lmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIEFORFJPSURfRUZGRUNUU1hNTENPTkZJR0xPQURFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaAppbmRleCA2NGEzMjEyLi5hNWExMmViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWUFQSV9IXwogI2RlZmluZSBBTkRST0lEX0VGRkVDVFNGQUNUT1JZQVBJX0hfCiAKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtNTIsNiArNTMsNyBAQAogLy8gICAgICAgICpwTnVtRWZmZWN0czogICAgIHVwZGF0ZWQgd2l0aCBudW1iZXIgb2YgZWZmZWN0cyBpbiBmYWN0b3J5CiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC03OSw2ICs4MSw3IEBACiAvLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTEwLDYgKzExMyw3IEBACiAvLyAgICAgICAgKnBIYW5kbGU6ICAgICAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgaGFuZGxlLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdENyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKTsKIApAQCAtMTMwLDYgKzEzNCw3IEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE1Myw2ICsxNTgsNyBAQAogLy8gICAgICAgICpwRGVzY3JpcHRvcjogICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTY5LDggKzE3NSwxMCBAQAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIHV1aWQgaXMgZXF1YWwgdG8gRUZGRUNUX1VVSURfTlVMTC4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RJc051bGxVdWlkKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkKTsKIAorQU5EUk9JRF9BUEkKIGludCBFZmZlY3REdW1wRWZmZWN0cyhpbnQgZmQpOwogCiAjaWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS90ZXN0L0R1bXBDb25maWcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L3Rlc3QvRHVtcENvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExNTZiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS90ZXN0L0R1bXBDb25maWcuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c0NvbmZpZ0xvYWRlci5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgY29uc3QgY2hhciogcGF0aCA9IG51bGxwdHI7CisgICAgYm9vbCBsZWdhY3lGb3JtYXQ7CisKKyAgICBpZiAoYXJnYyA9PSAyICYmIHN0cmNtcChhcmd2WzFdLCAiLS1sZWdhY3kiKSA9PSAwKSB7CisgICAgICAgIGxlZ2FjeUZvcm1hdCA9IHRydWU7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRHVtcGluZyBsZWdhY3kgZWZmZWN0IGNvbmZpZyBmaWxlXG4iKTsKKyAgICB9IGVsc2UgaWYgKChhcmdjID09IDIgfHwgYXJnYyA9PSAzKSAmJiBzdHJjbXAoYXJndlsxXSwgIi0teG1sIikgPT0gMCkgeworICAgICAgICBsZWdhY3lGb3JtYXQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGFyZ2MgPT0gMykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdW1waW5nIFhNTCBlZmZlY3QgY29uZmlnIGZpbGU6ICVzXG4iLCBwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRHVtcGluZyBkZWZhdWx0IFhNTCBlZmZlY3QgY29uZmlnIGZpbGUuXG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBhcmd1bWVudHMuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiVXNhZ2U6ICVzIFstLWxlZ2FjeXwtLXhtbCBbRklMRV1dXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCFsZWdhY3lGb3JtYXQpIHsKKyAgICAgICAgc3NpemVfdCByZXQgPSBFZmZlY3RMb2FkWG1sRWZmZWN0Q29uZmlnKHBhdGgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb2FkWG1sRWZmZWN0Q29uZmlnIGZhaWxlZCwgc2VlIGxvZ2NhdCBmb3IgZGV0YWlsLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJ0aWFsbHkgZmFpbGVkIHRvIGxvYWQgY29uZmlnLiBTa2lwcGVkICV6dSBlbGVtZW50cywgIgorICAgICAgICAgICAgICAgICAgICAic2VlIGxvZ2NhdCBmb3IgZGV0YWlsLlxuIiwgKHNpemVfdClyZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxlZ2FjeUZvcm1hdCkgeworICAgICAgICBhdXRvIHJldCA9IEVmZmVjdExvYWRFZmZlY3RDb25maWcoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibG9hZEVmZmVjdENvbmZpZyBmYWlsZWQsIHNlZSBsb2djYXQgZm9yIGRldGFpbC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJsZWdhY3kgbG9hZEVmZmVjdENvbmZpZyBoYXMgcHJvYmFibHkgc3VjY2VlZCwgc2VlIGxvZ2NhdCB0byBtYWtlIHN1cmUuXG4iKTsKKyAgICB9CisKKyAgICBpZiAoRWZmZWN0RHVtcEVmZmVjdHMoU1RET1VUX0ZJTEVOTykgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVmZmVjdCBkdW1wIGZhaWxlZCwgc2VlIGxvZ2NhdCBmb3IgZGV0YWlsLlxuIik7CisgICAgICAgIHJldHVybiA0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKaW5kZXggODNlODI4OC4uOTQxZWIzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKQEAgLTcyLDE5ICs3MiwyNSBAQAogICAgIENvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmMgXAogICAgIENvbW1vbi9zcmMvQ29weV8xNi5jIFwKICAgICBDb21tb24vc3JjL01vbm9UbzJJXzE2LmMgXAorICAgIENvbW1vbi9zcmMvTW9ub1RvMklfMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jIFwKICAgICBDb21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMgXAorICAgIENvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYyBcCiAgICAgQ29tbW9uL3NyYy9BYnNfMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMgXAogICAgIENvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMgXAogICAgIENvbW1vbi9zcmMvbXVsdDNzXzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMgXAogICAgIENvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYyBcCiAgICAgQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jIFwKICAgICBDb21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMgXAogICAgIENvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMgXAogICAgIENvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jIFwKICAgICBDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMgXAogICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyBcCiAgICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMgXApAQCAtMTIwLDcgKzEyNiw3IEBACiAgICAgJChMT0NBTF9QQVRIKS9TdGVyZW9XaWRlbmluZy9zcmMgXAogICAgICQoTE9DQUxfUEFUSCkvU3RlcmVvV2lkZW5pbmcvbGliCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCkBAIC0xNzksNiArMTg1LDcgQEAKICAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9saWIgXAogICAgICQoTE9DQUxfUEFUSCkvQ29tbW9uL3NyYwogCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAppbmRleCAyMjg5NzdkLi40YzJiOTU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaApAQCAtMTk4LDYgKzE5OCwxMCBAQAogI2RlZmluZSBMVkRCRV9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICA2NAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgMjU2CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAxMDI0CisjZW5kaWYKIAogdHlwZWRlZiBlbnVtCiB7CkBAIC0yMTAsNiArMjE0LDEwIEBACiAgICAgTFZEQkVfRlNfMzIwMDAgPSA2LAogICAgIExWREJFX0ZTXzQ0MTAwID0gNywKICAgICBMVkRCRV9GU180ODAwMCA9IDgsCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgTFZEQkVfRlNfOTYwMDAgPSA5LAorICAgIExWREJFX0ZTXzE5MjAwMCA9IDEwLAorI2VuZGlmCiAgICAgTFZEQkVfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0ZzX2VuOwogCkBAIC00NTAsMTIgKzQ1OCwxNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQogTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCmluZGV4IGIxZWJhZGYuLmYzMmVkMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgX19MVkRCRV9DT0VGRlNfSF9fCiAKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTE0LDUgKzUxNSw2MzIgQEAKICNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLwogI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCiAKKyNlbHNlIC8qQlVJTERfRkxPQVQqLwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkRCRV9TQ0FMRVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpZ2ggUGFzcyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA1NUh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU4ODQ5ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MTc2OThmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU4ODQ5ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MzkwMDFmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwODA3ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NjkwOWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTMzODE4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NjkwOWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU1NzMyZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1NjY5MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Njg2NTBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzNzMwMGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Njg2NTBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTMyN2YKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjAxMzhmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTczNTg4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NDcxNzZmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczNTg4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Njk0OTRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5OTUyZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzY3MWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU1MzQzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzY3MWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc3ODYzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODEwNWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzg1NTFmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1NzEwMmYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzg1NTFmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3OTY2MmYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk4NjZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDQyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjIwODRmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDQyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODQ3NDZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0ODYxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA5N2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY2MTk0ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA5N2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg4OTMxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4ODk5MmYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODM1MzlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NzA3OWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODM1MzlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4OTgzMWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODk4ODJmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MjA4MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NDkxNWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ5MjhmCisKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NDU4OGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NzQ1OGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTc0NjFmCiAjZW5kaWYKKworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTMwMTZmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkwNjAzMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NTMwMTZmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyNjgxMGYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMC45MjkzOTZmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNjM4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MjUyNzVmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNjM4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NDY4ODFmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ4MjU2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDcxOGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTI5NDM1ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDcxOGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTUxMTk2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1MjM1OWYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzA2MjJmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MTI0NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzA2MjJmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MzM5NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjQwNTJmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1NTA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTEwMTlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1NTA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzM0MzZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczNzg0ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NjU2M2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTUzMTI1ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NjU2M2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc1NTk0ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NTg4OWYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk1NDdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTA5M2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk1NDdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MTY5NWYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE4NjFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDEwZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjQwMTlmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDEwZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODY3MThmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2ODA1ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjU0MGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY1MDc5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjU0MGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg3Nzk3ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4Nzg3MWYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTcxMDc3ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTkzODk4ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzkxN2YKKworI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc0MDg2ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk2OTQ5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njk1NGYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk0NjY5M2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTEuODkzMzg3ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk0NjY5M2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTEzNTE3ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjkxNzEwNWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NTc5OTlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkxNTk5OGYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTc5OTlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzNzIyOWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45MzkxNDBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwNDQ2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MjA4OTJmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwNDQ2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NDIzMjZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTQzOTQ0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NzM5N2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM0Nzk0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NzM5N2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU2NzQwZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1NzY1NmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzMxNTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0NjMxM2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzMxNTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2ODYwN2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjkwOTJmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc0Mzk4ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NDg3OTdmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc0Mzk4ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzExNTdmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNTY4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzkxOGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU1ODM2ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzkxOGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc4MzY3ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU5OWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODA4MjRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MTY0OWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODA4MjRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NDMwM2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0MjVmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxNDUwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjI5MDBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxNDUwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODU1NzhmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NjgxZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45Njk5ODRmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45OTI3ODlmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODE1ZgorCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzM1MzlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTYzOTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2NDAxZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA5MEh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NDA0MTJmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuODgwODI1ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwNDEyZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkwMDIzMWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjkwNDk3N2YKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45MDY3NjZmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NTMzODNmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTI3NTc5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTMwMTExZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTU2MTkzZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjkxMjM4N2YKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1NjE5M2YKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45MzM0NTlmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45MzU2MDNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NjQxODNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTI4MzY1ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTY0MTgzZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MDA4N2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MTMwM2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NDE2MThmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzA4MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTYzNzc4ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NDIzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTcyMjM5ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk0NDQ3N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MjIzOWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjY3MjFmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjcyNjZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzYyOTJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTUyNTg0ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTc2MjkyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NTA0MGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NTM0N2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTkyODJmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45Nzk2NDFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTgxODg4ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDUwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTgwMzYyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MDcyNGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MDM2MmYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODMzNTlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODM0OTdmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2ODg5MmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MTY4MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTE3MTRmCisKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3Mjk5MmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTg0MGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4NDhmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCYW5kIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA1NUh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDkxOTdmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgLTAuMDA5MTk3ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3OTU0NWYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTM5M2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNjY5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDY2OTFmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTg1NDg4ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDY0ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2MTUwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjE1MGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODY3MzNmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODc1NTdmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQ2MjBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA0NjIwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MDE4OWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MDY1M2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMzM1N2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDMzNTdmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkyOTY0ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMjA5ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMDg1ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzA4NWYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTM1NTJmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTM3NTlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIzMTVmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAyMzE1ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTE5OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTMxNmYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTY4MWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDE2ODFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk2NTM3ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2NTk5ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNTQ1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTU0NWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY4MjNmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY4NzVmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMDc2MmYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDA3NjJmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk4NDYxZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4NDc3ZgorCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDAzODFmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMzgxZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5OTIzNGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5OTIzOGYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTI2NDhmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxMjY0OGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MTc2MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc0NDEyZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDkyMDlmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwOTIwOWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3OTk2NmYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzY4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDg0NjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwODQ2OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4MTY4NWYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgyODY5ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDYzNjRmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjM2NGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjQ1N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTI0ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQ2MjZmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDYyNmYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MDI4OGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjQxZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQyNTJmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDI1MmYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MTEwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkxMzk4ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDMxOTJmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzE5MmYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MzM3NGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNTQxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDIzMThmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMjMxOGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTIyMWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzA5ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDIxMzFmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMjEzMWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTYxNWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1NjkwZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA1NWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMDU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk3ODY4ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc4OTFmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgIC0wLjAwMDUyOGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgLTEuOTk4OTM5ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg5NDVmCisjZW5kaWYKKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE4NTcyZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTg1NzJmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTg3NDVmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2MjQyN2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDEzNTQ1ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMTM1NDVmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45NzA2NDdmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk3MjU5NmYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDEyNDU4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMTI0NThmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45NzMxNDhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk3NDc5NWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA5MzczZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDkzNzNmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODAxMDhmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4MTAzN2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2ODE5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDY4MTlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODU3MTRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4NjIwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2MjY4ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDYyNjhmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODY5MDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4NzMxOGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA0NzA5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDQ3MDlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTAyNDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MDQ3M2YKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzNDIxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDM0MjFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTI5NTVmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzA3OGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzMTQ0ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDMxNDRmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTM1MzVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzYzOWYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDAxNTU1NWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgLTEuOTk2ODYwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTY4OTFmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzc4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgIC0wLjAwMDc3OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgLTEuOTk4NDM3ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg0NDRmCisjZW5kaWYKKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjc2MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAtMC4wMjI3NjBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ5MDczZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzOTUzZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE2NjE5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxNjYxOWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjM3OTFmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjYzNzdmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTUyODlmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDE1Mjg5ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2Njg4MmYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2OTA2N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxMTUxMWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTE1MTFmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc1NDc3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NzExZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA4Mzc5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwODM3OWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODIzOTVmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODMwNDdmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDc3MDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA3NzA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4Mzg2M2YKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQxNGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNTc4OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDU3ODlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTg3OTc3ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg4Mjg4ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MjA3ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDIwN2YKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTEzMjRmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTE0ODhmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDM4NjdmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAzODY3ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MjAzOGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE3N2YKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxOTEzZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAxOTEzZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk2MTM0ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MTc0ZgorCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA5NThmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDA5NThmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAtMS45OTgwNzVmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgMC45OTgwODVmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBdXRvbWF0aWMgR2FpbiBDb250cm9sIHRpbWUgY29uc3RhbnRzIGFuZCBnYWluIHNldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFHQyBUaW1lIGNvbnN0YW50cyAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44NDEzOTVmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg4MjIyM2YKKyNkZWZpbmUgQUdDX0FUVEFDS19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxMjUxZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45MTcyNzZmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjkzOTI2N2YKKyNkZWZpbmUgQUdDX0FUVEFDS19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ0MDYxZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NTc3NDVmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTE1OGYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNjI4ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODU3MTJmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MzBmCisjZW5kaWYKKworI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBBR0NfREVDQVlfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNDJmCisjZGVmaW5lIEFHQ19ERUNBWV9GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzMGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDI4ZgorI2RlZmluZSBBR0NfREVDQVlfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMjFmCisjZGVmaW5lIEFHQ19ERUNBWV9GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxNWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE0ZgorI2RlZmluZSBBR0NfREVDQVlfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTBmCisjZGVmaW5lIEFHQ19ERUNBWV9GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwOGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDA3ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19ERUNBWV9GUzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzNWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZTMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMTc1ZgorI2VuZGlmCisKKy8qIEFHQyBHYWluIHNldHRpbmdzICovCisjZGVmaW5lIEFHQ19HQUlOX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19UQVJHRVRMRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4ODU1M2YKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDEyNTM4ZgorI2RlZmluZSBBR0NfR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU4NDg5M2YKKyNkZWZpbmUgQUdDX0dBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTIyMDE4ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8yZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43NzgyNzlmCisjZGVmaW5lIEFHQ19HQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1ODkyNWYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MjYyZgorI2RlZmluZSBBR0NfR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIzODcyMWYKKyNkZWZpbmUgQUdDX0dBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgorI2RlZmluZSBBR0NfSFBGR0FJTl81ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE4ODZmCisjZGVmaW5lIEFHQ19HQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fNmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODE4MzgzZgorI2RlZmluZSBBR0NfR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzdkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2MjI3OGYKKyNkZWZpbmUgQUdDX0dBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgorI2RlZmluZSBBR0NfSFBGR0FJTl84ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NDgxMzRmCisjZGVmaW5lIEFHQ19HQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fOWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTgxMDcyZgorI2RlZmluZSBBR0NfR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzEwZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ2NjgzNmYKKyNkZWZpbmUgQUdDX0dBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMTE4NzJmCisjZGVmaW5lIEFHQ19HQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjIzNDEzZgorI2RlZmluZSBBR0NfR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzEzZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjMwOTU3M2YKKyNkZWZpbmUgQUdDX0dBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNi4wNzk0NThmCisjZGVmaW5lIEFHQ19HQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDYuOTQzMjgyZgorI2RlZmluZSBBR0NfR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVm9sdW1lIGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBWb2x1bWUgY29udHJvbCBnYWluICovCisjZGVmaW5lIFZPTFVNRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCisjZGVmaW5lIFZPTFVNRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCisKKy8qIFZvbHVtZSBjb250cm9sIHRpbWUgY29uc3RhbnRzICovCisjZGVmaW5lIFZPTF9UQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIFZPTF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDI0NjkwZgorI2RlZmluZSBWT0xfVENfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNzk3N2YKKyNkZWZpbmUgVk9MX1RDX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY1MjlmCisjZGVmaW5lIFZPTF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDEyNDIyZgorI2RlZmluZSBWT0xfVENfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwOTAyOWYKKyNkZWZpbmUgVk9MX1RDX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgyOTlmCisjZGVmaW5lIFZPTF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA2MjMxZgorI2RlZmluZSBWT0xfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDUyNWYKKyNkZWZpbmUgVk9MX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQxNThmCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIFZPTF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDc5ZgorI2RlZmluZSBWT0xfVENfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTAzOWYKKyNlbmRpZgorI2RlZmluZSBNSVhfVENfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTM2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODk2MTUxICovCisjZGVmaW5lIE1JWF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMjMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MjI1NDggKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0MjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyODQxNSAqLworI2RlZmluZSBNSVhfVENfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDk3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQ1Mzg3ICovCisjZGVmaW5lIE1JWF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTk4MDQgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE1NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2Mjk1NiAqLworI2RlZmluZSBNSVhfVENfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTg1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcxOTczICovCisjZGVmaW5lIE1JWF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1MTUgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIxNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBNSVhfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQ1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkwNTMwICovCisjZGVmaW5lIE1JWF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNjExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTI1MjQgKi8KKyNlbmRpZgorCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwppbmRleCBiNjYzMmEzLi5mZDQwMTZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKQEAgLTEwNywzNSArMTA3LDY4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCiB7CiAKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgdGFibGUgb2Zmc2V0cwogICAgICAqLwotICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7Ci0KKyAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzE5MjAwMCkpKTsKKyNlbHNlCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHRhYmxlIG9mZnNldHMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOyAgICAKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgaGlnaCBwYXNzIGZpbHRlcgogICAgICAqLwotICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLwotICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLCAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworI2lmbmRlZiBCVUlMRF9GTE9BVAorICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLCAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCi0gICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisjZWxzZQorICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyNlbmRpZgorI2lmbmRlZiBCVUlMRF9GTE9BVAorICAgIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJRX0MzMl9Db2Vmc190ICopJkxWREJFX0hQRl9UYWJsZVtPZmZzZXRdKTsKKyNlbHNlCisgICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlFfRkxPQVRfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7CisjZW5kaWYKIAogCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgYmFuZCBwYXNzIGZpbHRlcgogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLwotICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6XAorICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwogICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworI2Vsc2UKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZW5kaWYKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0MzMl9Db2Vmc190ICopJkxWREJFX0JQRl9UYWJsZVtPZmZzZXRdKTsKLQorI2Vsc2UKKyAgICBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUF9GTE9BVF9Db2Vmc190ICopJkxWREJFX0JQRl9UYWJsZVtPZmZzZXRdKTsKKyNlbmRpZgogfQogCiAKQEAgLTE3NSw3ICsyMDgsOSBAQAogICAgIHsKICAgICAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW4gICA9IExWREJFX0FHQ19HQUlOX1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkVmZmVjdExldmVsXTsgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgb2ZmICovCiAgICAgfQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19HYWluU2hpZnQgPSBBR0NfR0FJTl9TSElGVDsKKyNlbmRpZgogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19UYXJnZXQgPSBBR0NfVEFSR0VUTEVWRUw7CiAKIH0KQEAgLTIxMiw2ICsyNDcsOSBAQAogICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLwogICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICBkQlNoaWZ0c19mYWM7CisjZW5kaWYKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgaWYgZW5hYmxlZAogICAgICAqLwpAQCAtMjM3LDMzICsyNzUsNTggQEAKICAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSg2ICsgVm9sdW1lICUgNik7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGRCcyAwLTUgKi8KICAgICBkQlNoaWZ0cyA9IChMVk1fVUlOVDE2KShWb2x1bWUgLyAtNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIDZkQiBzaGlmdHMgKi8KIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBkQlNoaWZ0c19mYWMgPSAoTFZNX0ZMT0FUKSgxIDw8IGRCU2hpZnRzKTsKKyNlbmRpZgogICAgIC8qCiAgICAgICogV2hlbiBEQkUgaXMgZW5hYmxlZCB1c2UgQUdDIHZvbHVtZQogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9ICgoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSA8PCAxNik7CiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID4+IGRCU2hpZnRzOwotCisjZWxzZQorICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9IChMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCAvIGRCU2hpZnRzX2ZhYzsKKyNlbmRpZgogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVRDICAgID0gTFZEQkVfVm9sdW1lVENUYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWVTaGlmdCA9IFZPTFVNRV9TSElGVCsxOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIFdoZW4gREJFIGlzIGRpc2FibGVkIHVzZSB0aGUgYnlwYXNzIHZvbHVtZSBjb250cm9sCiAgICAgICovCiAgICAgaWYoZEJTaGlmdHMgPiAwKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLCgoKExWTV9JTlQzMilMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pID4+IGRCU2hpZnRzKSk7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIC8gZEJTaGlmdHNfZmFjKTsKKyNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sKExWTV9JTlQzMilMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOworI2Vsc2UKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisjZW5kaWYKICAgICB9CiAKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisjZWxzZQorICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisjZW5kaWYKIH0KIAogCkBAIC0zMDksNyArMzcyLDExIEBACiB7CiAKICAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVk1peGVyM18yU3Rfc3QgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXI7CisjZWxzZQorICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKKyNlbmRpZgogCiAKICAgICAvKgpAQCAtMzMyLDEyICszOTksMTkgQEAKICAgICB7CiAgICAgICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKIAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAogICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKworICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisjZW5kaWYKIAogCiAgICAgfQpAQCAtMzU3LDEzICs0MzEsMjMgQEAKIAogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PTiAmJiBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYpCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwKTsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMHgwMDAwN0ZGRik7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMCk7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAxLjBmKTsKKyNlbmRpZgogICAgIH0KICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZT09TFZEQkVfT0ZGICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09OKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMHgwMDAwN0ZGRik7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDApOworI2Vsc2UKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDEuMGYpOworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCk7CisjZW5kaWYKICAgICB9CiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKaW5kZXggYTM2MjNiYy4uM2ZmZjJhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCkBAIC04MCw3ICs4MCwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBEYXRhIG1lbW9yeQogICAgICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgPSBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KTsKKyNlbHNlCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9EYXRhX3QpOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQV9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTg4LDcgKzkyLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIENvZWYgbWVtb3J5CiAgICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfQ29lZl90KTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgPSBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KTsKKyNlbHNlCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOyAgIAorI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTk2LDcgKzEwNCwxMiBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQogICAgICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KICAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSpzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgPSBTY3JhdGNoU2l6ZTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLkFsaWdubWVudCAgICA9IExWREJFX1NDUkFUQ0hfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgPSBMVkRCRV9TQ1JBVENIOwpAQCAtMTUxLDEwICsxNjQsMTYgQEAKIHsKIAogICAgIExWREJFX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICAgICAgICpwTWl4ZXJfSW5zdGFuY2U7CisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgIE1peEdhaW47CisjZWxzZQogICAgIExWTWl4ZXIzXzFTdF9zdCAgICAgICAqcE1peGVyX0luc3RhbmNlOwogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICBpOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICBNaXhHYWluOworI2VuZGlmCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIGk7CiAKIAogICAgIC8qCkBAIC0yMzUsNyArMjU0LDExIEBACiAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbWl4ZXIgd2l0aCBzb21lIGZpeGVzIHZhbHVlcyBzaW5jZSBvdGhlcndpc2UgTFZEQkVfU2V0Vm9sdW1lIGVuZHMgdXAKICAgICAvLyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YQogICAgIHBNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWU7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sMHgwMDAwN0ZGRiwweDAwMDA3RkZGKTsKKyNlbHNlCisgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIDEuMCwgMS4wKTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBJbml0aWFsaXNlIHRoZSB2b2x1bWUKQEAgLTI0NSw5ICsyNjgsMTMgQEAKIAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZSA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgYXMgdGhlIHRhcmdldCAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTWl4R2FpbiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pOwogICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLE1peEdhaW4sTWl4R2Fpbik7CisjZWxzZQorICAgIE1peEdhaW4gPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgTWl4R2FpbiwgTWl4R2Fpbik7CisjZW5kaWYKIAogICAgIC8qIENvbmZpZ3VyZSB0aGUgbWl4ZXIgcHJvY2VzcyBwYXRoICovCiAgICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKQEAgLTI2OCw5ICsyOTUsMTEgQEAKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0wOworCiAgICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sMCwwKTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAogICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KQEAgLTI3OCw5ICszMDcsMTUgQEAKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0wOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLDB4MDAwMDdGRkYsMHgwMDAwN0ZGRik7CiAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIDEuMCwgMS4wKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogCiAgICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKaW5kZXggODMzOWQzYy4uNGU1MjA3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCkBAIC03Nyw2ICs3Nyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogRGF0YSBzdHJ1Y3R1cmUgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogQUdDIHBhcmFtZXRlcnMgKi8KQEAgLTk4LDcgKzk5LDI5IEBACiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgIEJQRkluc3RhbmNlOyAgICAgICAgLyogQmFuZCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLwogCiB9IExWREJFX0NvZWZfdDsKKyNlbHNlCisvKiBEYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBBR0MgcGFyYW1ldGVycyAqLworICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgIEFHQ0luc3RhbmNlOyAgICAgICAgLyogQUdDIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KIAorICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgIEhQRlRhcHM7ICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciB0YXBzICovCisgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgIEJQRlRhcHM7ICAgICAgICAgICAgLyogQmFuZCBwYXNzIGZpbHRlciB0YXBzICovCisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICAgICAgICAgICAgIEJ5cGFzc1ZvbHVtZTsgICAgICAgLyogQnlwYXNzIHZvbHVtZSBzY2FsZXIgKi8KKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAvKiBCeXBhc3MgTWl4ZXIgZm9yIENsaWNrIFJlbW92YWwgKi8KKworfSBMVkRCRV9EYXRhX0ZMT0FUX3Q7CisKKy8qIENvZWZzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBQcm9jZXNzIHZhcmlhYmxlcyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICBIUEZJbnN0YW5jZTsgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAgQlBGSW5zdGFuY2U7ICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCit9IExWREJFX0NvZWZfRkxPQVRfdDsKKyNlbmRpZgogLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMTA4LDggKzEzMSwxMyBAQAogICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAgICBDYXBhYmlsaXRpZXM7ICAgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBEYXRhIGFuZCBjb2VmZmljaWVudCBwb2ludGVycyAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWREJFX0RhdGFfdCAgICAgICAgICAgICAgICAqcERhdGE7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGRhdGEgKi8KICAgICBMVkRCRV9Db2VmX3QgICAgICAgICAgICAgICAgKnBDb2VmOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBjb2VmZmljaWVudHMgKi8KKyNlbHNlCisgICAgTFZEQkVfRGF0YV9GTE9BVF90ICAgICAgICAgICAgICAgICpwRGF0YTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgZGF0YSAqLworICAgIExWREJFX0NvZWZfRkxPQVRfdCAgICAgICAgICAgICAgICAqcENvZWY7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGNvZWZmaWNpZW50cyAqLworI2VuZGlmCiB9IExWREJFX0luc3RhbmNlX3Q7CiAKIApAQCAtMTM2LDUgKzE2NCwzIEBACiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAogI2VuZGlmICAgICAgLyogX19MVkRCRV9QUklWQVRFX0hfXyAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCmluZGV4IDY5ZDc5ZDIuLjEwZWE3MDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgIkFHQy5oIgogI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03MiwxMzYgKzcxLDIzNiBAQAogLyogICAgIG92ZXJhbGwgZW5kIHRvIGVuZCBnYWluIGlzIG9kQi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAorTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgIGNvbnN0IExWTV9JTlQxNiAqcEluRGF0YSwgTFZNX0lOVDE2ICpwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CiAKLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCisgIExWREJFX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90ICopIGhJbnN0YW5jZTsKKyAgTFZNX0lOVDMyICpwU2NyYXRjaCA9CisgICAgICAoTFZNX0lOVDMyICopIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7CisgIExWTV9JTlQzMiAqcE1vbm87CisgIExWTV9JTlQxNiAqcElucHV0ID0gKExWTV9JTlQxNiAqKSBwSW5EYXRhOworCisgIC8qIFNjcmF0Y2ggZm9yIFZvbHVtZSBDb250cm9sIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIHNob3J0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCisgIExWTV9JTlQxNiAqcFNjcmF0Y2hWb2wgPSAoTFZNX0lOVDE2ICopICgmcFNjcmF0Y2hbTnVtU2FtcGxlc10pOworCisgIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDIqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgcE1vbm8gPSAmcFNjcmF0Y2hbMiAqIE51bVNhbXBsZXNdOworCisgIC8qCisgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAqLworICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkgeworICAgIHJldHVybiAoTFZEQkVfVE9PTUFOWVNBTVBMRVMpOworICB9CisKKyAgLyoKKyAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAqLworICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pCisgICAgICB8fCAoTFZDX01peGVyX0dldEN1cnJlbnQoCisgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKQorICAgICAgICAgICE9IExWQ19NaXhlcl9HZXRUYXJnZXQoCisgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKSB7CisKKyAgICAvKgorICAgICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gMzItYml0IGFuZCBzY2FsZQorICAgICAqIChGb3IgYSAxNi1iaXQgaW1wbGVtZW50YXRpb24gYXBwbHkgaGVhZHJvb20gbG9zcyBoZXJlKQorICAgICAqLworICAgIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihwSW5wdXQsIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLworICAgIHBTY3JhdGNoLCAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KKyAgICAoTFZNX0lOVDE2KSAoMiAqIE51bVNhbXBsZXMpLCAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KKyAgICBMVkRCRV9TQ0FMRVNISUZUKTsgLyogU2hpZnQgc2NhbGUgICAgICAgICAgICovCisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pIHsKKyAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLworICAgICAgKExWTV9JTlQzMiAqKSBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgIChMVk1fSU5UMzIgKikgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAoTFZNX0lOVDE2KSBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgKi8KKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KKyAgICAgKi8KKyAgICBGcm9tMmlUb01vbm9fMzIocFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLworICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KKyAgICAoTFZNX0lOVDE2KSBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCisgICAgICovCisgICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAgKi8KKyAgICAoTFZNX0lOVDMyICopIHBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgICAoTFZNX0lOVDMyICopIHBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KKyAgICAoTFZNX0lOVDE2KSBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAorICAgICAqLworICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLworICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCisgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLworICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIC8qCisgICAgICogQ29udmVydCAzMi1iaXQgc2FtcGxlcyB0byAxNi1iaXQgYW5kIHNhdHVyYXRlCisgICAgICogKE5vdCByZXF1aXJlZCBmb3IgMTYtYml0IGltcGxlbWVuYXRpb25zKQorICAgICAqLworICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsIC8qIFNvdXJjZSAzMi1iaXQgZGF0YSAgICAqLworICAgIChMVk1fSU5UMTYgKikgcFNjcmF0Y2gsIC8qIERlc3QuIDE2LWJpdCBkYXRhICAgICAqLworICAgIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcyksIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLworICAgIExWREJFX1NDQUxFU0hJRlQpOyAvKiBTaGlmdCBzY2FsZSAgICAgICAgICAgKi8KKworICB9CisKKyAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKQorICAgICAgfHwgKExWQ19NaXhlcl9HZXRDdXJyZW50KAorICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKKyAgICAgICAgICAhPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KAorICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkgeworCisgICAgLyoKKyAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgorICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCisgICAgICovCisgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwgcEluRGF0YSwKKyAgICAgICAgcFNjcmF0Y2hWb2wsIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgICAqLworCisgIH0KKworICAvKgorICAgKiBNaXggREJFIHByb2Nlc3NlZCBwYXRoIGFuZCBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICovCisgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKKyAgICAgIChMVk1fSU5UMTYgKikgcFNjcmF0Y2gsIHBTY3JhdGNoVm9sLCBwT3V0RGF0YSwKKyAgICAgIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcykpOworCisgIHJldHVybiAoTFZEQkVfU1VDQ0VTUyk7Cit9CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICBjb25zdCBMVk1fRkxPQVQgKnBJbkRhdGEsCisgICAgTFZNX0ZMT0FUICpwT3V0RGF0YSwKKyAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCiB7CiAKLSAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgICpwU2NyYXRjaCAgPSAoTFZNX0lOVDMyICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgICpwTW9ubzsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICpwSW5wdXQgICAgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKyAgTFZEQkVfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKKyAgTFZNX0ZMT0FUICpwU2NyYXRjaF9pbiA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbgorICBbTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgTFZNX0ZMT0FUICpwU2NyYXRjaCA9IHBTY3JhdGNoX2luICsgMiAqIE51bVNhbXBsZXM7CisgIExWTV9GTE9BVCAqcE1vbm87CisgIExWTV9JTlQzMiBpaSA9IDA7CiAKKyAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiA0Kk51bVNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2hWb2wgPSAoTFZNX0ZMT0FUICopKCZwU2NyYXRjaF9pbls0ICogTnVtU2FtcGxlc10pOworLy8gIExWTV9JTlQxNiAqcFNjcmF0Y2hWb2xfaW50ID0gKExWTV9JTlQxNiAqKShwU2NyYXRjaFZvbCk7CiAKLSAgICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDIqTnVtU2FtcGxlcyBzaG9ydCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBTY3JhdGNoVm9sID0gKExWTV9JTlQxNiAqKSgmcFNjcmF0Y2hbTnVtU2FtcGxlc10pOworICAvKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZiA2Kk51bVNhbXBsZXMgMzItYml0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCisgIHBNb25vID0gJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXTsKIAotICAgIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDIqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgICBwTW9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICZwU2NyYXRjaFsyKk51bVNhbXBsZXNdOworICAvKgorICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgKi8KKyAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgIHsKKyAgICByZXR1cm4oTFZEQkVfVE9PTUFOWVNBTVBMRVMpOworICB9CisKKyAgLyoKKyAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byBGbG9hdAorICAgKi8KKyAgQ29weV9GbG9hdChwSW5EYXRhLCAvKiBTb3VyY2UgMTYtYml0IGRhdGEgICAgKi8KKyAgICAgIHBTY3JhdGNoX2luLCAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KKyAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLworCisgIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7CisgICAgcFNjcmF0Y2hbaWldID0gcFNjcmF0Y2hfaW5baWldOworICB9CisgIC8qCisgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgKi8KKyAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KKyAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKXx8CisgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKQorICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkKKyAgewogCiAgICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCiAgICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCiAgICAgewotICAgICAgICByZXR1cm4oTFZEQkVfVE9PTUFOWVNBTVBMRVMpOworICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCisgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLwogICAgIH0KIAogICAgIC8qCi0gICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQogICAgICAqLwotICAgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKXx8Ci0gICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCi0gICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpCi0gICAgewotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gMzItYml0IGFuZCBzY2FsZQotICAgICAgICAgKiAoRm9yIGEgMTYtYml0IGltcGxlbWVudGF0aW9uIGFwcGx5IGhlYWRyb29tIGxvc3MgaGVyZSkKLSAgICAgICAgICovCi0gICAgICAgIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9TQ0FMRVNISUZUKTsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLCAgICAgICAgICAgLyogU291cmNlICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCi0gICAgICAgICAqLwotICAgICAgICBGcm9tMmlUb01vbm9fMzIocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBNb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKLSAgICAgICAgICovCi0gICAgICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgICAgIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcE1vbm8sICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBNb25vLCAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4Ci0gICAgICAgICAqLwotICAgICAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAgICAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCAzMi1iaXQgc2FtcGxlcyB0byAxNi1iaXQgYW5kIHNhdHVyYXRlCi0gICAgICAgICAqIChOb3QgcmVxdWlyZWQgZm9yIDE2LWJpdCBpbXBsZW1lbmF0aW9ucykKLSAgICAgICAgICovCi0gICAgICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAzMi1iaXQgZGF0YSAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwgICAgICAgICAgICAvKiBEZXN0LiAxNi1iaXQgZGF0YSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpLCAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfU0NBTEVTSElGVCk7ICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLwotCi0gICAgfQotCi0gICAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwotICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpfHwKLSAgICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKLSAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKLSAgICB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKLSAgICAgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKLSAgICAgICAgICovCi0gICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFZvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAgICovCi0KLSAgICB9CisgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KKyAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCiAKICAgICAvKgotICAgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCiAgICAgICovCi0gICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsKKyAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLworICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLworICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KIAotICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAorICAgICAqLworICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLworICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KKyAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLworICAgICAgICBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCAyICogTnVtU2FtcGxlczsgaWkrKykgeworICAgICAgLy9UT0RPOiByZXBsYWNlIHdpdGggZXhpc3RpbmcgY2xhbXBpbmcgZnVuY3Rpb24KKyAgICAgIGlmKHBTY3JhdGNoW2lpXSA8IC0xLjApIHsKKyAgICAgICAgcFNjcmF0Y2hbaWldID0gLTEuMDsKKyAgICAgIH0gZWxzZSBpZihwU2NyYXRjaFtpaV0gPiAxLjApIHsKKyAgICAgICAgcFNjcmF0Y2hbaWldID0gMS4wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KKyAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRil8fAorICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKKyAgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKSkpCisgIHsKKworICAgIC8qCisgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKKyAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQorICAgICAqLworICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgIHBTY3JhdGNoX2luLAorICAgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgfQorCisgIC8qCisgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgKi8KKyAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAorICAgICAgcFNjcmF0Y2gsCisgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgIHBPdXREYXRhLAorICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKworICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CiB9Ci0KLQotCi0KLQotCi0KLQotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCmluZGV4IGY1ZDIyOWUuLmM0YTliMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKQEAgLTM2LDcgKzM2LDExIEBACiAvKgogICogSGlnaCBQYXNzIEZpbHRlciBDb2VmZmljaWVudCB0YWJsZQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBCUV9DMzJfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgQlFfRkxPQVRfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM4MDAwX0ZjNTVfQTEsCkBAIC04Myw2ICs4NywxOCBAQAogICAgICBIUEZfRnM0ODAwMF9GYzU1X0EwLAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM5NjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzU1X0IxfSwKKyNlbmRpZgogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7SFBGX0ZzODAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTEzMCw2ICsxNDYsMTkgQEAKICAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMCwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzOTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM5NjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnM5NjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMxOTIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczE5MjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCisjZW5kaWYKKwogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7SFBGX0ZzODAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTE3Nyw2ICsyMDYsMTkgQEAKICAgICAgSFBGX0ZzNDgwMDBfRmM3OF9BMCwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzOTYwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM5NjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnM5NjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMxOTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczE5MjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM3OF9CMX0sCisjZW5kaWYKKwogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7SFBGX0ZzODAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTIyMywxMiArMjY1LDMyIEBACiAgICAgIEhQRl9GczQ4MDAwX0ZjOTBfQTEsCiAgICAgIEhQRl9GczQ4MDAwX0ZjOTBfQTAsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMX19OworICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMX0KKworI2lmZGVmIEhJR0hFUl9GUworICAgICwKKyAgICB7SFBGX0ZzOTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM5NjAwMF9GYzkwX0ExLAorICAgICBIUEZfRnM5NjAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxOTIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczE5MjAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM5MF9CMX0KKyNlbmRpZgorCit9OwogCiAvKgogICogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudCB0YWJsZQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBCUF9DMzJfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgQlBfRkxPQVRfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtCUEZfRnM4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzODAwMF9GYzU1X0IyLApAQCAtMjU3LDYgKzMxOSwxNCBAQAogICAgIHtCUEZfRnM0ODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAgIHtCUEZfRnM5NjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAgIHtCUEZfRnMxOTIwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAorI2VuZGlmCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtCUEZfRnM4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMjg2LDYgKzM1NiwxNCBAQAogICAgIHtCUEZfRnM0ODAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczk2MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMTkyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IxfSwKKyNlbmRpZgogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7QlBGX0ZzODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTMxNSw2ICszOTMsMTQgQEAKICAgICB7QlBGX0ZzNDgwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtCUEZfRnM5NjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczE5MjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMX0sCisjZW5kaWYKIAogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgOTBIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0JQRl9GczgwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0zNDMsNyArNDI5LDE5IEBACiAgICAgIC1CUEZfRnM0NDEwMF9GYzkwX0IxfSwKICAgICB7QlBGX0ZzNDgwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9fTsKKyAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtCUEZfRnM5NjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczE5MjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMX0KKyNlbmRpZgorCisKK307CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM1Myw3ICs0NTEsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEF0dGFjayB0aW1lIChzaWduYWwgdG9vIGxhcmdlKSAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDE2IExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICBBR0NfQVRUQUNLX0ZzODAwMCwKICAgICBBR0NfQVRUQUNLX0ZzMTEwMjUsCiAgICAgQUdDX0FUVEFDS19GczEyMDAwLApAQCAtMzYyLDEwICs0NjQsMjAgQEAKICAgICBBR0NfQVRUQUNLX0ZzMjQwMDAsCiAgICAgQUdDX0FUVEFDS19GczMyMDAwLAogICAgIEFHQ19BVFRBQ0tfRnM0NDEwMCwKLSAgICBBR0NfQVRUQUNLX0ZzNDgwMDB9OworICAgIEFHQ19BVFRBQ0tfRnM0ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfQVRUQUNLX0ZzOTYwMDAKKyAgICAsQUdDX0FUVEFDS19GczE5MjAwMAorI2VuZGlmCisKK307CiAKIC8qIERlY2F5IHRpbWUgKHNpZ25hbCB0b28gc21hbGwpICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfREVDQVlfVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICBBR0NfREVDQVlfRnM4MDAwLAogICAgIEFHQ19ERUNBWV9GczExMDI1LAogICAgIEFHQ19ERUNBWV9GczEyMDAwLApAQCAtMzc0LDEwICs0ODYsMjAgQEAKICAgICBBR0NfREVDQVlfRnMyNDAwMCwKICAgICBBR0NfREVDQVlfRnMzMjAwMCwKICAgICBBR0NfREVDQVlfRnM0NDEwMCwKLSAgICBBR0NfREVDQVlfRnM0ODAwMH07CisgICAgQUdDX0RFQ0FZX0ZzNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsQUdDX0RFQ0FZX0ZTOTYwMDAKKyAgICAsQUdDX0RFQ0FZX0ZTMTkyMDAwCisjZW5kaWYKKworfTsKIAogLyogR2FpbiBmb3IgdXNlIHdpdGhvdXQgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQzMiBMVkRCRV9BR0NfR0FJTl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0dBSU5fVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICBBR0NfR0FJTl8wZEIsCiAgICAgQUdDX0dBSU5fMWRCLAogICAgIEFHQ19HQUlOXzJkQiwKQEAgLTM5Niw3ICs1MTgsMTEgQEAKICAgICBBR0NfR0FJTl8xNWRCfTsKIAogLyogR2FpbiBmb3IgdXNlIHdpdGggdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQzMiBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICBBR0NfSFBGR0FJTl8wZEIsCiAgICAgQUdDX0hQRkdBSU5fMWRCLAogICAgIEFHQ19IUEZHQUlOXzJkQiwKQEAgLTQyMiw2ICs1NDgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUYWJsZVtdID0gewogICAgIDB4NDAwMCwgICAgICAgICAgICAgLyogLTZkQiAqLwogICAgIDB4NDdGQiwgICAgICAgICAgICAgLyogLTVkQiAqLwpAQCAtNDMwLDggKzU1NywyMiBAQAogICAgIDB4NjVBRCwgICAgICAgICAgICAgLyogLTJkQiAqLwogICAgIDB4NzIxNSwgICAgICAgICAgICAgLyogLTFkQiAqLwogICAgIDB4N0ZGRn07ICAgICAgICAgICAgLyogIDBkQiAqLworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVGFibGVbXSA9IHsKKyAgICAwLjUwMDAwMGYsICAgICAgICAgLyogLTZkQiAqLworICAgIDAuNTYyMzQxZiwgICAgICAgICAvKiAtNWRCICovCisgICAgMC42MzA5NTdmLCAgICAgICAgIC8qIC00ZEIgKi8KKyAgICAwLjcwNzk0NmYsICAgICAgICAgLyogLTNkQiAqLworICAgIDAuNzk0MzI4ZiwgICAgICAgICAvKiAtMmRCICovCisgICAgMC44OTEyNTFmLCAgICAgICAgIC8qIC0xZEIgKi8KKyAgICAxLjAwMDAwMGZ9OyAgICAgICAgLyogIDBkQiAqLworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVENUYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVENUYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIFZPTF9UQ19GczgwMDAsCiAgICAgVk9MX1RDX0ZzMTEwMjUsCiAgICAgVk9MX1RDX0ZzMTIwMDAsCkBAIC00NDAsOSArNTgxLDE3IEBACiAgICAgVk9MX1RDX0ZzMjQwMDAsCiAgICAgVk9MX1RDX0ZzMzIwMDAsCiAgICAgVk9MX1RDX0ZzNDQxMDAsCi0gICAgVk9MX1RDX0ZzNDgwMDB9OworICAgIFZPTF9UQ19GczQ4MDAwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLFZPTF9UQ19Gczk2MDAwCisgICAgLFZPTF9UQ19GczE5MjAwMAorI2VuZGlmCit9OworCisKIAogY29uc3QgTFZNX0lOVDE2IExWREJFX01peGVyVENUYWJsZVtdID0geworCiAgICAgTUlYX1RDX0ZzODAwMCwKICAgICBNSVhfVENfRnMxMTAyNSwKICAgICBNSVhfVENfRnMxMjAwMCwKQEAgLTQ1MSw2ICs2MDAsMTAgQEAKICAgICBNSVhfVENfRnMyNDAwMCwKICAgICBNSVhfVENfRnMzMjAwMCwKICAgICBNSVhfVENfRnM0NDEwMCwKLSAgICBNSVhfVENfRnM0ODAwMH07CisgICAgTUlYX1RDX0ZzNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsTUlYX1RDX0ZzOTYwMDAKKyAgICAsTUlYX1RDX0ZzMTkyMDAwCisjZW5kaWYKIAotCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCmluZGV4IDQ3NmU2YTAuLmNhNDZlMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzYsOCArNzcsNTcgQEAKIAogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUQ1RhYmxlW107CiAKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENvZWZmaWNpZW50cyBjb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhpZ2ggUGFzcyBGaWx0ZXIgQ29lZmZpY2llbnQgdGFibGUKKyAqLworZXh0ZXJuIGNvbnN0IEJRX0ZMT0FUX0NvZWZzX3QgTFZEQkVfSFBGX1RhYmxlW107CisKKy8qCisgKiBCYW5kIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50IHRhYmxlCisgKi8KK2V4dGVybiBjb25zdCBCUF9GTE9BVF9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFHQyBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXTsKKworLyogRGVjYXkgdGltZSAoc2lnbmFsIHRvbyBzbWFsbCkgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW107CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19HQUlOX1RhYmxlW107CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRoIHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVm9sdW1lIGNvbnRyb2wgZ2FpbiBhbmQgdGltZSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUQ1RhYmxlW107CisKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KKwogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9NaXhlclRDVGFibGVbXTsKIAorCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAppbmRleCAxZmYyYTJjLi45YjZkYTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaApAQCAtNTE0LDExICs1MTQsMTkgQEAKIC8qICAgICAgU1RFUkVPICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwYWlycyBpbiB0aGUgYmxvY2sgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKKyNlbHNlCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworI2VuZGlmCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwppbmRleCA2Y2JlZTdkLi4wYTNjMzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKQEAgLTQ4LDcgKzQ4LDE1MiBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJNYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSU5UMTYgICAgICAgIFNhbXBsZUNvdW50OyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkIHRoaXMgY2FsbCAqLworICAgIExWTV9JTlQxNiAgICAgICAgTnVtU2FtcGxlczsgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBzY3JhdGNoIGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCAgICAgICAgKnBTdGFydDsKKyAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7CisgICAgTFZNX0ZMT0FUICAgICAgICAqcERlc3Q7CisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IDI7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBwcm9jZXNzaW5nIGFkZHJlc3MgcG9pbnRlcnMKKyAgICAgKi8KKyAgICBwQnVmZmVyICAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgcERlc3QgICAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKyAgICAqcFRvUHJvY2VzcyA9IHBCdWZmZXItPnBTY3JhdGNoOworICAgICpwUHJvY2Vzc2VkID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayBvZiBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKyBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9IChMVk1fRkxPQVQgKilwSW5EYXRhOworICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSAgICAgICAgPSBMVk1fRklSU1RDQUxMOworICAgIH0KKyAgICBwU3RhcnQgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7ICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzICovCisgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyB0byBvdXRwdXQgaXMgc2FtZSBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciByZWFkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsIGFuZCB1cGRhdGUgdGhlIGJ1ZmZlciBzdGF0ZQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUHJvY2VzcyB0aGUgbWF4aW11bSBib2NrIHNpemUgb2Ygc2FtcGxlcy4KKyAgICAgICAgICovCisgICAgICAgIFNhbXBsZUNvdW50ID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBMYXN0IGNhbGwgZm9yIHRoZSBibG9jaywgc28gY2FsY3VsYXRlIGhvdyBtYW55IGZyYW1lcyBhbmQgc2FtcGxlcyB0byBwcm9jZXNzCisgICAgICAgICAgKi8KKyAgICAgICAgTFZNX0lOVDE2ICAgTnVtRnJhbWVzOworCisgICAgICAgIE51bVNhbXBsZXMgID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICBOdW1GcmFtZXMgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgU2FtcGxlQ291bnQgPSAoTFZNX0lOVDE2KShOdW1GcmFtZXMgPDwgTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCisgICAgICAgICAqLworICAgICAgICBpZiAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fRklSU1RMQVNUQ0FMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0xBU1RDQUxMOworICAgICAgICB9CisgICAgfQorICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KVNhbXBsZUNvdW50OyAgLyogU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCAqLworCisKKyAgICAvKgorICAgICAqIENvcHkgc2FtcGxlcyBmcm9tIHRoZSBkZWxheSBidWZmZXIgYXMgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZiAoKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKSAmJgorICAgICAgICAocEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpKTsgICAgLyogTnVtYmVyIG9mIGRlbGF5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7IC8qIFVwZGF0ZSBzYW1wbGUgY291bnQgKi8KKyAgICAgICAgcERlc3QgKz0gTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlczsgICAgICAvKiBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVzdCBvZiB0aGUgc2FtcGxlcyBmb3IgdGhpcyBjYWxsIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gMCkKKyAgICB7CisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscyAqIE51bVNhbXBsZXMpKTsgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwU3RhcnQgKz0gTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgaW5wdXQgcG9pbnRlciAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgaW5wdXQgZGF0YSBwb2ludGVyIGFuZCBzYW1wbGVzIHRvIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgLyogVXBkYXRlIHNhbXBsZXMgdG8gb3V0cHV0ICovCisgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IChMVk1fSU5UMTYpKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCArIE51bVNhbXBsZXMpOworICAgIH0KKworCisgICAgLyoKKyAgICAgICogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgYW5kIGlucHV0IHBvaW50ZXIKKyAgICAgKi8KKyAgICAvKiBVcGRhdGUgdGhlIGNvdW50IG9mIHNhbXBsZXMgKi8KKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gU2FtcGxlQ291bnQpOworICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICAgPSBwU3RhcnQ7IC8qIFVwZGF0ZSBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLworCisKKyAgICAvKgorICAgICAqIFNhdmUgc2FtcGxlcyB0byB0aGUgZGVsYXkgYnVmZmVyIGlmIGFueSBsZWZ0IHVucHJvY2Vzc2VkCisgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkgfHwKKyAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9MQVNUQ0FMTCkpCisgICAgeworICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHBTdGFydCAgICArPSBOdW1DaGFubmVscyAqIFNhbXBsZUNvdW50OyAvKiBPZmZzZXQgYnkgdGhlIG51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICBpZiAoTnVtU2FtcGxlcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscyAqIE51bVNhbXBsZXMpKTsgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGRlbGF5IHNhbXBsZSBjb3VudAorICAgICAgICAgKi8KKyAgICAgICAgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgICAgID0gTnVtU2FtcGxlczsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZSBwYWlycyAqLworICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgU2FtcGxlcyB1c2VkICovCisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlck1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKipwVG9Qcm9jZXNzLApAQCAtMTg5LDcgKzMzNCw3IEBACiAgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBTYW1wbGVzIHVzZWQgKi8KICAgICB9CiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjEzLDcgKzM1OCw0NyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOyAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gZmlyc3QgY2FsbCAqLworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAqcFRvUHJvY2VzczsgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBJL08gcG9pbnRlcnMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICA9ICpwUHJvY2Vzc2VkOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcHJvY2VzcyBwb2ludGVycworICAgICAqLworICAgICpwVG9Qcm9jZXNzID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOworICAgICpwUHJvY2Vzc2VkID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsKK30KKyNlbHNlCiB2b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKipwVG9Qcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqKnBQcm9jZXNzZWQsCkBAIC0yNTIsNyArNDM3LDcgQEAKICAgICAqcFRvUHJvY2VzcyA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsKICAgICAqcFByb2Nlc3NlZCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7CiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjc4LDYgKzQ2Myw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIExWTV9CdWZmZXJPcHRpbWlzZWRJbihMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICoqcFRvUHJvY2VzcywKQEAgLTQxNiw3ICs2MDIsNyBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ3MSw3ICs2NTcsMzcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVk1fQnVmZmVySW4oTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRJbihoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLApAQCAtNTAxLDcgKzcxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CiAgICAgfQogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTUyMiw3ICs3MzgsMTU2IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlck1hbmFnZWRPdXQoTFZNX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX0luc3RhbmNlX3QgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fQnVmZmVyX3QgICAgKnBCdWZmZXIgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIExWTV9JTlQxNiAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOworICAgIExWTV9JTlQxNiAgICAgICBOdW1TYW1wbGVzOworICAgIExWTV9GTE9BVCAgICAgICAqcFN0YXJ0OworICAgIExWTV9GTE9BVCAgICAgICAqcERlc3Q7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBwb2ludGVycworICAgICAqLworICAgIE51bVNhbXBsZXMgPSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQ7CisgICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOworCisKKyAgICAvKgorICAgICAqIGNoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKKyAgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKQorICAgIHsKKyAgICAgICAgLyogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9IHBPdXREYXRhOyAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZGVzdGluYXRpb24gKi8KKyAgICB9CisgICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgb3V0cHV0IGFkZHJlc3MgKi8KKworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm9uLXplcm8gdGhlbiB0aGVyZSBhcmUgc3RpbGwgc2FtcGxlcyB0byBzZW5kIHRvCisgICAgICogdGhlIG91dHB1dCBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoKE51bVNhbXBsZXMgIT0gMCkgJiYKKyAgICAgICAgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAhPSAwKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGRlbGF5ZWQgb3V0cHV0IGJ1ZmZlciBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPD0gTnVtU2FtcGxlcykKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgYWxsIG91dHB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCArPSAyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogU2FtcGxlcyBsZWZ0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VuZCAqLworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3VwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERlc3QgKz0gMiAqIE51bVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAtIE51bVNhbXBsZXMpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmVhbGlnbiB0aGUgZGVsYXkgYnVmZmVyIGRhdGEgdG8gYXZvaWQgdXNpbmcgY2lyY3VsYXIgYnVmZmVyIG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIE51bVNhbXBsZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBwcm9jZXNzZWQgcmVzdWx0cyB0byB0aGUgb3V0cHV0CisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChTYW1wbGVDb3VudCAhPSAwKSkKKyAgICB7CisgICAgICAgIGlmIChTYW1wbGVDb3VudCA8PSBOdW1TYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBhbGwgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBOdW1TYW1wbGVzICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBTYW1wbGVDb3VudCk7ICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgICAgICAgICBTYW1wbGVDb3VudCA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBvbmx5IHNvbWUgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVycyBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBTdGFydCAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBTYW1wbGVDb3VudCAgPSAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCAtIE51bVNhbXBsZXMpOyAvKiBQcm9jZXNzZWQgc2FtcGxlcyBsZWZ0ICovCisgICAgICAgICAgICBOdW1TYW1wbGVzICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVtYWluaW5nIHByb2Nlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyCisgICAgICovCisgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCisgICAgeworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXNdLCAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICAvKiBVcGRhdGUgdGhlIGJ1ZmZlciBjb3VudCAqLworICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgKyBTYW1wbGVDb3VudCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBwb2ludGVycywgY291bnRzIGFuZCBzZXQgZGVmYXVsdCBidWZmZXIgcHJvY2Vzc2luZworICAgICAqLworICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwRGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSAgICAgID0gTFZNX01BWEJMT0NLQ0FMTDsgICAgICAgICAgICAgICAgICAgLyogU2V0IGZvciB0aGUgZGVmYXVsdCBjYWxsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBzaXplICovCisgICAgLyogVGhpcyB3aWxsIHRlcm1pbmF0ZSB0aGUgbG9vcCB3aGVuIGFsbCBzYW1wbGVzIHByb2Nlc3NlZCAqLworICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKK30KKyNlbHNlCiB2b2lkIExWTV9CdWZmZXJNYW5hZ2VkT3V0KExWTV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKQEAgLTY3Miw3ICsxMDM3LDcgQEAKICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSAgICAgID0gTFZNX01BWEJMT0NLQ0FMTDsgICAgICAgICAgICAgICAgICAgLyogU2V0IGZvciB0aGUgZGVmYXVsdCBjYWxsIGJsb2NrIHNpemUgKi8KICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7ICAgICAgICAgLyogVGhpcyB3aWxsIHRlcm1pbmF0ZSB0aGUgbG9vcCB3aGVuIGFsbCBzYW1wbGVzIHByb2Nlc3NlZCAqLwogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc0MSw2ICsxMTA2LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZE91dChMVk1fSGFuZGxlX3QgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKIHsKQEAgLTgwNSw3ICsxMTcxLDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04NDMsNyArMTIwOSwzMSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJPdXQoTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgd2hpY2ggbW9kZSwgbWFuYWdlZCBvciB1bm1hbmFnZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZE91dChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KK30KKyNlbHNlCiB2b2lkIExWTV9CdWZmZXJPdXQoTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCkBAIC04NjcsNCArMTI1Nyw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOwogICAgIH0KIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKaW5kZXggMjcxMmIyYy4uMzUzNTYwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtMjYsMTAgKzI2LDY1NSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBUcmVibGVCb29zdENvcm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwCi0jZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBUcmVibGVCb29zdE1pblJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDIyMDUwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAzODQzNAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMTU5OQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDgxNTU3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjg4NDc1CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjk5NDMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNDAwOTAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE4NDIzMgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4NTgwMQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjQ1MTQ1CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI0ODg3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMTM0OTEKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNTY1NDEKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM5MDE3NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMjAxNDQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ3NjIxOQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMDYxODcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU3Mjc2MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDI3MjgKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42ODEwODIKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzExMDQ5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODAyNjIwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQzMjU4OAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkzODk4OQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41Njg5NTYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTE5OTcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzIxOTY0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjYzNjc0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg5MzY0MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ1NjMwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wODYyNjcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjQwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDQ0NjYyCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjIzMjg3CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTQ3NzMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNzMxNzYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE1MDk5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjExNjk1MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjE0MDg2CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDUzODYzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yODQ4NzAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDE2OTIxCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM2NDI5MQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjA5NjM0MgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDUzNDAzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4NTQ1NAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTUzMzg5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4NTQ0MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjY1NTc0CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM5NzYyNQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc5MTQ0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41MjM0OTkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MzI2ODIKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjY0NzMzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDkxMTQ4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjgyMzE5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI2ODk1MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wMDEwMDEKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi40Njg0NDcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjAwNDk4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjkyMjg3CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQyNDMzOAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAzMjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNjEwMDkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDYxMDA5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyOTQ2MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTI5NDYzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwNjI2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjA2MjY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjkyNDQ3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5MjQ0NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM4OTE0MAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zODkxNDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDk3NjMxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc2MzEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjE5MzYxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MTkzNjEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzU1OTQzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NTU5NDMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTA5MTkxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45MDkxOTEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA4MTEzOQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDgxMTM5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI3NDA2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yNzQwNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40OTA1MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS40OTA1MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNzMzNDE4CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjczMzQxOAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wMDU5MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMDA1OTM2CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzExNzA3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMzExNzA3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0NDEwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNzQzNjQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjkzMjU3CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTU3ODAxCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM3NjY5NQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjUxNDIwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDcwMzEzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzU2NDYxCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NTM1NQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ3NDMyMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42OTMyMTMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYwNjU1OQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjgyNTQ1MworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzU0OTM1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTczODI4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTIxNDE0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjE0MDMwOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjEwODIwOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4zMjcxMDEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMTc3OTMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS41MzY2ODcKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NTI5NTIKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS43NzE4NDYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44MTY4MDUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMzU2OTgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTEyODUyCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjMzMTc0NgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ0NTAyMworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjY2MzkxNgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjgxNzcyNAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjAzNjYxOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgNDgwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA3NzM1NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzQ1MzA2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NDE1MgorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDMyMTAxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI2MTUzOAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTI5NDg4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNzA4MDcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42Mzg3NTcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ5MzQwOQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2MTM1OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYzMDk3MQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44OTg5MjAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43ODUzMTgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDUzMjY3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTg0OTgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMjY0NDcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTUyODA5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS40MjA3NTgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAyLjM3MDgyOQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNjM4Nzc4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjE1NDUyCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuODgzNDAxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODg5OTI0CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMTU3ODczCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjE5Nzg4NgorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi40NjU4MzUKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDM0MjUKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi44MTEzNzQKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAzLjkzMTEyNworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMTk5MDc2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCisjaWZkZWYgSElHSEVSX0ZTCisKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgOTYwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NjIzMworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjczNTgzCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwNDIwOAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzgxNTU4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMyNTM1OAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTAyNzA4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NjEyOTEKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wMzg2NDEKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYxMzgxMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjE5MTE2MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc4NDkzOQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4zNjIyODkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk3Njk0OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS41NTQyOTkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE5MjM4NworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjc2OTczOAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQzNDExMworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMDExNDY0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMi43MDUzMzUKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIuMjgyNjg1CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMDA5NjUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuNTg3MDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjM1MTA5NworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjkyODQ0NworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjczNDIwNworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMy4zMTE1NTgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjE2NDA2NAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTMuNzQxNDE0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNC42NDYzNzEKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC00LjIyMzcyMQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAxOTIwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTA3ODIzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODc1MTUwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI4ODAzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTk2MTMwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM2NDU0NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjEzMTg3MQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTY4NDkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yODQxNzYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4NzczNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS40NTUwNjQKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44Nzk0NzcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjY0NjgwNAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTQ2MTMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjg2MTk0MAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzM1OTk5CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjEwMzMyNgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi42MDY4MzkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4zNzQxNjYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjkxMDcyNgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIuNjc4MDUzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4yNTE2OTMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMDE5MDIwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42MzQyNjQKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuNDAxNTkxCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjA2MzUxNgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuODMwODQzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTQ1MTQ1CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC00LjMxMjQ3MgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wODU1NDIKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtNC44NTI4NjgKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisKKyNlbmRpZgorCisjZWxzZQogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAyMjA1MEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE2NDI5MSAqLwpAQCAtNTcxLDMgKzEyMTYsNCBAQAogCiAKICNlbmRpZgorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKaW5kZXggNzI1NjRkNC4uY2ZlNTNiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCkBAIC02NSw5ICs2NSwxNiBAQAogICAgIGlmKAogICAgICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KICAgICAgICAgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICYmCisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAorI2Vsc2UKICAgICAgICAgKChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkpICAgICAgfHwKKyNlbmRpZgogICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSB8fAogICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPiBMVk1fRVhfSEVBRFBIT05FUykpCiAgICAgewpAQCAtMjY4LDcgKzI3NSwxMiBAQAogdm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGV4dGVybiBGT19GTE9BVF9MU2h4X0NvZWZzX3QgIExWTV9UcmVibGVCb29zdENvZWZzW107CisjZWxzZQogICAgIGV4dGVybiBGT19DMTZfTFNoeF9Db2Vmc190ICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOworI2VuZGlmCisKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPZmZzZXQ7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWwgPSAwOwogCkBAIC0yOTgsNiArMzEwLDIwIEBACiAgICAgICAgICAgICAgKiBMb2FkIHRoZSBjb2VmZmljaWVudHMgYW5kIGVuYWJsZWQgdGhlIHRyZWJsZSBib29zdAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShFZmZlY3RMZXZlbCAtIDEgKyBUcmVibGVCb29zdFN0ZXBzICogKHBQYXJhbXMtPlNhbXBsZVJhdGUgLSBUcmVibGVCb29zdE1pblJhdGUpKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDbGVhciB0aGUgdGFwcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9GTE9BVCkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsICAvKiBEZXN0aW5hdGlvbi5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcykgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworI2Vsc2UKICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkxWTV9UcmVibGVCb29zdENvZWZzW09mZnNldF0pOwpAQCAtMzA5LDYgKzMzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgIC8qIERlc3RpbmF0aW9uLlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKS9zaXplb2YoTFZNX0lOVDE2KSkpOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKQEAgLTM0Miw2ICszNjksOSBAQAogICAgIExWTV9VSU5UMTYgICAgICBkQlNoaWZ0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDZkQiBzaGlmdHMgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgZEJPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBvZmZzZXQgKi8KICAgICBMVk1fSU5UMTYgICAgICAgVm9sdW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgIFRlbXA7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogTGltaXQgdGhlIGdhaW4gdG8gdGhlIG1heGltdW0gYWxsb3dlZApAQCAtNDAxLDIyICs0MzEsNDYgQEAKICAgICAgKi8KICAgICBpZihkQlNoaWZ0cyA9PSAwKQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOwotICAgIH0KKyNlbmRpZgorICAgICAgICB9CiAgICAgZWxzZQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBUZW1wID0gTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XTsKKyAgICAgICAgd2hpbGUoZEJTaGlmdHMpIHsKKyAgICAgICAgICAgIFRlbXAgPSBUZW1wIC8gMi4wZjsKKyAgICAgICAgICAgIGRCU2hpZnRzLS07CisgICAgICAgIH0KKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIFRlbXApOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKExWTV9JTlQzMilMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKT4+ZEJTaGlmdHMpKTsKKyNlbmRpZgogICAgIH0KICAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDE7CiAgICAgaWYocEluc3RhbmNlLT5Ob1Ntb290aFZvbHVtZSA9PSBMVk1fVFJVRSkKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworI2VuZGlmCiAgICAgfQogfQogCkBAIC01NTQsOCArNjA4LDIzIEBACiAgICAgICAgIC8qIENvbmZpZ3VyZSBNaXhlciBtb2R1bGUgZm9yIGdyYWR1YWwgY2hhbmdlcyB0byB2b2x1bWUqLwogICAgICAgICBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlIDwgMCkKICAgICAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OworI2Vsc2UKICAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisjZW5kaWYKICAgICAgICAgICAgIC8qIERyb3AgaW4gcmlnaHQgY2hhbm5lbCB2b2x1bWUqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sIFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKworICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gZEJfdG9fTGluRmxvYXQoKExWTV9JTlQxNikoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8PCA0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKyNlbHNlCiAgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLFRhcmdldCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKQEAgLTU2MywxMSArNjMyLDI3IEBACiAgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KShMb2NhbFBhcmFtcy5WQ19CYWxhbmNlPDw0KSk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlID4wKQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CisjZWxzZQogICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyNlbmRpZgogICAgICAgICAgICAgLyogRHJvcCBpbiBsZWZ0IGNoYW5uZWwgdm9sdW1lKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gZEJfdG9fTGluRmxvYXQoKExWTV9JTlQxNikoKC1Mb2NhbFBhcmFtcy5WQ19CYWxhbmNlKSA8PCA0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sIFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKworICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gTFZNX01BWEZMT0FUOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisjZWxzZQogICAgICAgICAgICAgVGFyZ2V0ID0gZEJfdG9fTGluMzIoKExWTV9JTlQxNikoKC1Mb2NhbFBhcmFtcy5WQ19CYWxhbmNlKTw8NCkpOwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLFRhcmdldCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKQEAgLTU3NSwxNyArNjYwLDM2IEBACiAgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OworI2Vsc2UKICAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisjZW5kaWYKICAgICAgICAgICAgIC8qIE5vIGRyb3AqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7CisjZWxzZQogICAgICAgICAgICAgVGFyZ2V0ID0gTFZNX01BWElOVF8xNjsKKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKyNlbHNlCiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOwogCiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAgICAgLyoKQEAgLTEwMDgsMTggKzExMTIsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgIENhbGxCYWNrUGFyYW0pCiB7CiAgICAgTFZNX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKXBCdW5kbGVIYW5kbGU7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgVGFyZ2V0OworI2Vsc2UKICAgICBMVk1fSU5UMzIgICAgVGFyZ2V0OworI2VuZGlmCiAKICAgICAodm9pZCkgcEdlbmVyYWxQdXJwb3NlOwogICAgICh2b2lkKSBDYWxsQmFja1BhcmFtOwogCiAgICAgLyogV2hlbiB2b2x1bWUgbWl4ZXIgaGFzIHJlYWNoZWQgMCBkQiB0YXJnZXQgdGhlbiBzdG9wIGl0IHRvIGF2b2lkCiAgICAgICAgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZy4gKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdKTsKKyAgICBpZihUYXJnZXQgPT0gMS4wZikKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgIH0KKyNlbHNlCiAgICAgVGFyZ2V0ID0gTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0pOwogCiAgICAgaWYoVGFyZ2V0ID09IDB4N0ZGRikKICAgICB7CiAgICAgICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlID0gTFZNX0ZBTFNFOwogICAgIH0KKyNlbmRpZgogICAgIHJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKaW5kZXggNTQyYzNjOC4uMjZjMWM0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCkBAIC0yMzIsNyArMjMyLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyNlbHNlCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDA7CisjZW5kaWYKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7CiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gSW50ZXJuYWxCbG9ja1NpemU7CiAKQEAgLTI2NSw3ICsyNjksMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOworI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CisjZW5kaWYKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gSW50ZXJuYWxCbG9ja1NpemU7CiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJhbmRzICAgICA9IHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzOwpAQCAtNTQyLDEwICs1NTAsMTUgQEAKICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAoTFZNX0lOVDMyKSg2ICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0lOVDE2KSk7CiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPnBTY3JhdGNoID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgLyogU2NyYXRjaCAxIGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpQnVuZGxlU2NyYXRjaFNpemUpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOworI2Vsc2UKICAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOworI2VuZGlmCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlTYW1wbGVzID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsgLyogU2V0IHRoZSBudW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5PdXREZWxheVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+QnVmZmVyU3RhdGUgPSBMVk1fRklSU1RDQUxMOyAgICAgICAgICAgICAvKiBTZXQgdGhlIHN0YXRlIHJlYWR5IGZvciB0aGUgZmlyc3QgY2FsbCAqLwpAQCAtNTk4LDE0ICs2MTEsMjYgQEAKICAgICAvKiBJbiBtYW5hZ2VkIGJ1ZmZlcmluZywgc3RhcnQgd2l0aCBsb3cgc2lnbmFsIGxldmVsIGFzIGRlbGF5IGluIGJ1ZmZlciBtYW5hZ2VtZW50IGNhdXNlcyBhIGNsaWNrKi8KICAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLDApOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyNlbmRpZgogICAgIH0KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sMCxMVk1fRlNfODAwMCwyKTsKKyNlbHNlCisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIExWTV9GU184MDAwLCAyKTsKKyNlbmRpZgogCiAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiAgICAgICAgICAgICAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lICAgICAgICAgICAgPSAwOwpAQCAtNjE1LDE1ICs2NDAsMjQgQEAKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKKyNlbHNlCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2LExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOwogCiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSAgICA9IHBJbnN0YW5jZTsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX1ZDQ2FsbEJhY2s7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7CisjZWxzZQogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyNlbmRpZgogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMVk1fRlNfODAwMCwyKTsKKwogICAgIC8qCiAgICAgICogU2V0IHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKICAgICAgKi8KQEAgLTcwOSw3ICs3NDMsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTkyMDAwOworI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKIApAQCAtNzYzLDcgKzgwMSwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisjZWxzZQogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7CiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNvdXJjZUZvcm1hdCAgICA9IExWRVFOQl9DQVBfU1RFUkVPIHwgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU87CkBAIC04NjgsOSArOTEwLDE0IEBACiAgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKIAogICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZWxzZQorICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9JTlQxNikpOworI2VuZGlmCiAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sMCk7CiAKIApAQCAtOTk0LDcgKzEwNDEsNiBAQAogICAgIC8qIERDIHJlbW92YWwgZmlsdGVyICovCiAgICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwogCi0KICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCmluZGV4IDJlODVmNzcuLmI0NTMyMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaApAQCAtMTM4LDYgKzEzOCwyMyBAQAogCiAKIC8qIEJ1ZmZlciBNYW5hZ2VtZW50ICovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KKworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJ1ZmZlclN0YXRlOyAgICAgICAgLyogQnVmZmVyIHN0YXR1cyAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbNiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBJbnB1dCBidWZmZXIgZGVsYXkgbGluZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbkRlbGF5U2FtcGxlczsgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KKworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIE91dERlbGF5QnVmZmVyWzIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogT3V0cHV0IGJ1ZmZlciBkZWxheSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KK30gTFZNX0J1ZmZlcl90OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KQEAgLTE1MCwyMiArMTY3LDI4IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT3V0RGVsYXlTYW1wbGVzOyAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlciwgbGVmdCBhbmQgcmlnaHQgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9PdXRwdXQ7ICAgIC8qIFNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCAqLwogfSBMVk1fQnVmZmVyX3Q7Ci0KKyNlbmRpZgogCiAvKiBGaWx0ZXIgdGFwcyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190IFRyZWJsZUJvb3N0X1RhcHM7ICAgLyogVHJlYmxlIGJvb3N0IFRhcHMgKi8KKyNlbHNlCiAgICAgQmlxdWFkXzJJX09yZGVyMV9UYXBzX3QgVHJlYmxlQm9vc3RfVGFwczsgICAvKiBUcmVibGUgYm9vc3QgVGFwcyAqLworI2VuZGlmCiB9IExWTV9URV9EYXRhX3Q7CiAKLQogLyogQ29lZmZpY2llbnRzICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgVHJlYmxlQm9vc3RfU3RhdGU7ICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KKyNlbHNlCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgVHJlYmxlQm9vc3RfU3RhdGU7ICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KKyNlbmRpZgogfSBMVk1fVEVfQ29lZnNfdDsKIAotCiB0eXBlZGVmIHN0cnVjdAogewogICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCkBAIC0xODEsMTUgKzIwNCwyNCBAQAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOyAgLyogTWF4aW11bSBpbnRlcm5hbCBibG9jayBzaXplICovCiAgICAgTFZNX0J1ZmZlcl90ICAgICAgICAgICAgKnBCdWZmZXJNYW5hZ2VtZW50OyAvKiBCdWZmZXIgbWFuYWdlbWVudCB2YXJpYWJsZXMgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzOyAgIC8qIElucHV0IHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0U2FtcGxlczsgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPdXRwdXRTYW1wbGVzOyAgICAvKiBFeHRlcm5hbCBvdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBJbnB1dFNhbXBsZXM7ICAgICAvKiBFeHRlcm5hbCBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0cHV0U2FtcGxlczsgICAgLyogRXh0ZXJuYWwgb3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKIAogICAgIC8qIENvbmZpZ3VyYXRpb24gbnVtYmVyICovCiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbk51bWJlcjsKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBCbGlja1NpemVNdWx0aXBsZTsKIAogICAgIC8qIERDIHJlbW92YWwgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIERDX1JlbW92YWxJbnN0YW5jZTsgLyogREMgcmVtb3ZhbCBmaWx0ZXIgaW5zdGFuY2UgKi8KKyNlbHNlCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLworI2VuZGlmCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kICovCiAgICAgTFZDU19IYW5kbGVfdCAgICAgICAgICAgaENTSW5zdGFuY2U7ICAgICAgICAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLwpAQCAtMjA5LDggKzI0MSwxNiBAQAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIERCRV9BY3RpdmU7ICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAKICAgICAvKiBWb2x1bWUgQ29udHJvbCAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCisjZWxzZQogICAgIExWTWl4ZXIzXzFTdF9zdCAgICAgICAgIFZDX1ZvbHVtZTsgICAgICAgICAgLyogVm9sdW1lIHNjYWxlciAqLworI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICBWQ19CYWxhbmNlTWl4OyAgICAgIC8qIFZDIGJhbGFuY2UgbWl4ZXIgKi8KKyNlbHNlCiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgVkNfQmFsYW5jZU1peDsgICAgICAvKiBWQyBiYWxhbmNlIG1peGVyICovCisjZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWQ19Wb2x1bWVkQjsgICAgICAgIC8qIEdhaW4gaW4gZEIgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWQ19BY3RpdmU7ICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX0FWTEZpeGVkVm9sdW1lOyAgLyogQVZMIGZpeGVkIHZvbHVtZSAqLwpAQCAtMjM0LDcgKzI3NCwxMSBAQAogICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgIFBTQV9Db250cm9sUGFyYW1zOyAgLyogU3BlY3RydW0gQW5hbHl6ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgUFNBX0dhaW5PZmZzZXQ7ICAgICAvKiBUb25lIGNvbnRyb2wgZmxhZyAqLwogICAgIExWTV9DYWxsYmFjayAgICAgICAgICAgIENhbGxCYWNrOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBQU0FJbnB1dDsgICAgICAgICAvKiBQU0EgaW5wdXQgcG9pbnRlciAqLworI2Vsc2UKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFBTQUlucHV0OyAgICAgICAgIC8qIFBTQSBpbnB1dCBwb2ludGVyICovCisjZW5kaWYKIAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KIApAQCAtMjYxLDE2ICszMDUsMjggQEAKIAogdm9pZCAgICBMVk1fU2V0SGVhZHJvb20oICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICAgIExWTV9CdWZmZXJJbiggICBMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcyk7CisjZWxzZQogdm9pZCAgICBMVk1fQnVmZmVySW4oICAgTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAqKnBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAqKnBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgICBMVk1fQnVmZmVyT3V0KCAgTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKTsKKyNlbHNlCiB2b2lkICAgIExWTV9CdWZmZXJPdXQoICBMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpOworI2VuZGlmCiAKIExWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCAgICAgdm9pZCAgICAgICAgICAqcEJ1bmRsZUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcERhdGEsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwppbmRleCBmNWEwMWYzLi40YTE5YTEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTUxLDcgKzUxLDIzMSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIFNhbXBsZUNvdW50ID0gTnVtU2FtcGxlczsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXQgICAgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFRvUHJvY2VzcyA9IChMVk1fRkxPQVQgKilwSW5EYXRhOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwT3V0RGF0YTsKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICBTdGF0dXM7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENoZWNrIHZhbGlkIHBvaW50cyBoYXZlIGJlZW4gZ2l2ZW4KKyAgICAgKi8KKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgdW5tYW5hZ2VkIG1vZGUgb25seQorICAgICAqLworICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9VTk1BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgYSBnb29kIG11bHRpcGxlICh1bm1hbmFnZWQgbW9kZSBvbmx5KQorICAgICAgICAgKi8KKyAgICAgICAgaWYoKE51bVNhbXBsZXMgJSBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oTFZNX0lOVkFMSUROVU1TQU1QTEVTKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIHRoZSBidWZmZXIgYWxpZ25tZW50CisgICAgICAgICAqLworICAgICAgICBpZigoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oTFZNX0FMSUdOTUVOVEVSUk9SKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBTdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOworCisgICAgICAgIGlmKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IGZyb20gTW9ubyBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgTW9ub1RvMklfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBJbnB1dCAgICAgPSBwT3V0RGF0YTsKKyAgICAgICAgcFRvUHJvY2VzcyA9IHBPdXREYXRhOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIHRoZSBkYXRhIHdpdGggbWFuYWdlZCBidWZmZXJzCisgICAgICovCisgICAgd2hpbGUgKFNhbXBsZUNvdW50ICE9IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBNYW5hZ2UgdGhlIGlucHV0IGJ1ZmZlciBhbmQgZnJhbWUgcHJvY2Vzc2luZworICAgICAgICAgKi8KKyAgICAgICAgTFZNX0J1ZmZlckluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgIHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICZwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgJnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIE9ubHkgcHJvY2VzcyBkYXRhIHdoZW4gU2FtcGxlQ291bnQgaXMgbm9uZSB6ZXJvLCBhIHplcm8gY291bnQgY2FuIG9jY3VyIHdoZW4KKyAgICAgICAgICogdGhlIEJ1ZmZlckluIHJvdXRpbmUgaXMgd29ya2luZyBpbiBtYW5hZ2VkIG1vZGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgQ29uY2VydFNvdW5kIGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAodm9pZClMVkNTX1Byb2Nlc3MocEluc3RhbmNlLT5oQ1NJbnN0YW5jZSwgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHZvbHVtZSBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUhPTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGwgTi1CYW5kIGVxdWFsaXNlciBpZiBlbmFibGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWRVFOQl9Qcm9jZXNzKHBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZSwgICAgLyogTi1CYW5kIGVxdWFsaXNlciBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FsbCBiYXNzIGVuaGFuY2VtZW50IGlmIGVuYWJsZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+REJFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkRCRV9Qcm9jZXNzKHBJbnN0YW5jZS0+aERCRUluc3RhbmNlLCAgICAgICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBCeXBhc3MgbW9kZSBvciBldmVyeXRoaW5nIG9mZiwgc28gY29weSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocFRvUHJvY2VzcyAhPSBwUHJvY2Vzc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRyZWJsZSBib29zdCBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5URV9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUGVyZm9ybSBQYXJhbWV0cmljIFNwZWN0dW0gQW5hbHlzaXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT04pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID09IExWTV9QU0FfT04pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKKworICAgICAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogREMgcmVtb3ZhbAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZSB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgTFZNX0J1ZmZlck91dChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKKworICAgIH0KKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0yNzMsMyArNDk3LDQgQEAKIAogICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CiB9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKaW5kZXggZTE0ZjkwOS4uMTk5ZGRkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwpAQCAtMjksNyArMjksMzQyIEBACiAvKiAgICBUcmVibGUgQm9vc3QgRmlsdGVyIENvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKIAorRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgIExWTV9UcmVibGVCb29zdENvZWZzW10gPSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDI0a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiAzMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogNDRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMV9CMSx9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiA0OGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogMTkya0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjE1X0IxfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH07CisjZWxzZQogRk9fQzE2X0xTaHhfQ29lZnNfdCAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdID0gewogCiAgICAgICAgICAgICAgICAgICAgIC8qIDIya0h6IHNhbXBsaW5nIHJhdGUgKi8KQEAgLTM0MCw4ICs2NzUsOSBAQAogICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KICAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9BMCwKICAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTVfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnR9fTsKLQorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X1NoaWZ0fQorICAgICAgICAgICAgICAgICAgICB9OworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNTAsNiArNjg2LDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgTFZNX1ZvbHVtZVRhYmxlW10gPSB7CisgICAgMS4wMDBmLCAgICAgICAgICAgICAvKiAgMGRCICovCisgICAgMC44OTFmLCAgICAgICAgICAgICAvKiAtMWRCICovCisgICAgMC43OTRmLCAgICAgICAgICAgICAvKiAtMmRCICovCisgICAgMC43MDhmLCAgICAgICAgICAgICAvKiAtM2RCICovCisgICAgMC42MzFmLCAgICAgICAgICAgICAvKiAtNGRCICovCisgICAgMC41NjJmLCAgICAgICAgICAgICAvKiAtNWRCICovCisgICAgMC41MDFmfTsgICAgICAgICAgICAvKiAtNmRCICovCisjZWxzZQogY29uc3QgTFZNX0lOVDE2IExWTV9Wb2x1bWVUYWJsZVtdID0gewogICAgIDB4N0ZGRiwgICAgICAgICAgICAgLyogIDBkQiAqLwogICAgIDB4NzIxNSwgICAgICAgICAgICAgLyogLTFkQiAqLwpAQCAtMzU4LDYgKzcwNCw3IEBACiAgICAgMHg1MEMzLCAgICAgICAgICAgICAvKiAtNGRCICovCiAgICAgMHg0N0ZCLCAgICAgICAgICAgICAvKiAtNWRCICovCiAgICAgMHg0MDAwfTsgICAgICAgICAgICAvKiAtNmRCICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKaW5kZXggYTc2MDFmZi4uNGNmNzExOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaApAQCAtMzcsMTYgKzM3LDIzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOworI2Vsc2UKIGV4dGVybiBGT19DMTZfTFNoeF9Db2Vmc190ICAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVk1fVm9sdW1lVGFibGVbXTsKKyNlbHNlCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWTV9Wb2x1bWVUYWJsZVtdOworI2VuZGlmCisKIGV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdOwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKaW5kZXggMjA4MGQ2NC4uOWEzZDM1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKQEAgLTM3LDcgKzM3LDcgQEAKIC8qICAgIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgIEFHQ19HYWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IEFHQyBnYWluICovCkBAIC01MiwyMCArNTIsMzkgQEAKICAgICBMVk1fSU5UMTYgIFZvbHVtZVRDOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLwogCiB9IEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3Q7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgIEFHQ19HYWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICBBR0NfTWF4R2FpbjsgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgIFRhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0YXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19UYXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyB0YXJnZXQgbGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19BdHRhY2s7ICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyBhdHRhY2sgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUICBBR0NfRGVjYXk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgZGVjYXkgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUICBWb2x1bWVUQzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KIAorfSBBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3Q7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworI2Vsc2UKIHZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAppbmRleCA3YWM3ZmJkLi4zZWU3ZjYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaApAQCAtMjcsMTkgKzI3LDM0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbNl07CiAKK30gQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgU3RvcmFnZVs2XTsKIAogfSBCaXF1YWRfSW5zdGFuY2VfdDsKLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDT0VGRklDSUVOVCBUWVBFIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiBCaXF1YWQgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICBBMjsgICAvKiAgYTIgICovCisgICAgTFZNX0ZMT0FUICBBMTsgICAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUICBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0ZMT0FUICBCMTsgICAvKiAtYjEhICovCit9IEJRX0ZMT0FUX0NvZWZzX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgQTI7ICAgLyogIGEyICAqLwpAQCAtNTcsOCArNzIsMTcgQEAKICAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KICAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KIH0gQlFfQzMyX0NvZWZzX3Q7CisjZW5kaWYKIAogLyoqKiBGaXJzdCBvcmRlciBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fRkxPQVQgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMTsgICAvKiAtYjEhICovCit9IEZPX0ZMT0FUX0NvZWZzX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgQTE7ICAgLyogIGExICAqLwpAQCAtNzIsOCArOTYsMTcgQEAKICAgICBMVk1fSU5UMzIgIEEwOyAgIC8qICBhMCAgKi8KICAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KIH0gRk9fQzMyX0NvZWZzX3Q7CisjZW5kaWYKIAogLyoqKiBGaXJzdCBvcmRlciBjb2VmZmljaWVudHMgd2l0aCBTaGlmdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBBMTsgICAgLyogIGExICAqLworICAgIExWTV9GTE9BVCBBMDsgICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMTsgICAgLyogLWIxISAqLworfSBGT19GTE9BVF9MU2h4X0NvZWZzX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgQTE7ICAgIC8qICBhMSAgKi8KQEAgLTgxLDggKzExNCwxNiBAQAogICAgIExWTV9JTlQxNiBCMTsgICAgLyogLWIxISAqLwogICAgIExWTV9JTlQxNiBTaGlmdDsgLyogU2hpZnQgKi8KIH0gRk9fQzE2X0xTaHhfQ29lZnNfdDsKLQorI2VuZGlmCiAvKioqIEJhbmQgcGFzcyBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgIEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fRkxPQVQgIEIxOyAgIC8qIC1iMSEgKi8KK30gQlBfRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCkBAIC05Niw4ICsxMzcsMTggQEAKICAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KICAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KIH0gQlBfQzMyX0NvZWZzX3Q7CisjZW5kaWYKIAogLyoqKiBQZWFraW5nIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgQjI7ICAgLyogLWIyISAqLworICAgIExWTV9GTE9BVCBCMTsgICAvKiAtYjEhICovCisgICAgTFZNX0ZMT0FUICBHOyAgIC8qIEdhaW4gKi8KK30gUEtfRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCkBAIC0xMTMsMTYgKzE2NCwyNiBAQAogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogICAgIExWTV9JTlQxNiAgRzsgICAvKiBHYWluICovCiB9IFBLX0MzMl9Db2Vmc190OwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIFRBUFMgVFlQRSBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogVHlwZXMgdXNlZCBmb3IgZmlyc3Qgb3JkZXIgYW5kIHNoZWx2aW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDIpIF07ICAvKiBPbmUgY2hhbm5lbCwgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3Q7CiAKIHR5cGVkZWYgc3RydWN0CiB7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3Q7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDEqMikgXTsgIC8qIE9uZSBjaGFubmVsLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdDsKIApAQCAtMTMwLDEyICsxOTEsMjIgQEAKIHsKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDIqMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KIH0gQmlxdWFkXzJJX09yZGVyMV9UYXBzX3Q7Ci0KKyNlbmRpZgogCiAvKioqIFR5cGVzIHVzZWQgZm9yIGJpcXVhZCwgYmFuZCBwYXNzIGFuZCBwZWFraW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiA0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDEqNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KIH0gQmlxdWFkXzFJX09yZGVyMl9UYXBzX3Q7CiAKQEAgLTE0Myw3ICsyMTQsNyBAQAogewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMio0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KIH0gQmlxdWFkXzJJX09yZGVyMl9UYXBzX3Q7Ci0KKyNlbmRpZgogLyogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgYXJlIGNoYW5nZWQgdG8gc2F0aXNmeSBRQUMgcnVsZXM6IE5hbWUgc2hvdWxkIGJlIFVuaXF1ZSB3aXRoaW5nIDE2IGNoYXJhY3RlcnMqLwogI2RlZmluZSBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICBJbml0X0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxCiAjZGVmaW5lIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICAgICAgIFRXT19CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMgpAQCAtMTU0LDU5ICsyMjUsMTQ4IEBACiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKIC8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Cit2b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjE1LDMzICszNzUsNjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogRklSU1QgT1JERVIgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgICpwQ29lZik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCiAvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwordm9pZCBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKQEAgLTI1MCwxMyArNDQzLDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IEJBTkQgUEFTUyBGSUxURVJTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICpwQ29lZik7Cit2b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Cit2b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKQEAgLTI3NCwxMCArNDgyLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KLQorI2VuZGlmCiAvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgKCAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwordm9pZCBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiggICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjg2LDQyICs1MDEsNTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCiAKIC8qKiogMzIgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIFBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKLQogdm9pZCBQS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IERDIFJFTU9WQUwgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCit2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKIAogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKaW5kZXggNGNiOGFhMi4uNDk4ZmFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaApAQCAtNjYsMTMgKzY2LDE3IEBACiAvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBOb25MaW5Db21wX0Zsb2F0KExWTV9GTE9BVCAgICAgICAgR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpOworI2Vsc2UKIHZvaWQgTm9uTGluQ29tcF9EMTYoTFZNX0lOVDE2ICAgICAgICBHYWluLAogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwU3RlckJmSW4sCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGVyQmZPdXQsCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpOwotCi0KKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKaW5kZXggMjI5NzAxYS4uMGM4OTU1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKQEAgLTMzLDExICszMywzMiBAQAogICAgREVGSU5FUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIEZJTFRFUl9MT1NTICAgICAzMjczMCAgICAgICAvKiAtMC4wMWRCIGxvc3MgdG8gYXZvaWQgd3JhcHBpbmcgZHVlIHRvIGJhbmQgcmlwcGxlICovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBGSUxURVJfTE9TU19GTE9BVCAgICAwLjk5ODg0OWYKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCiAKK0xWTV9GTE9BVCBMVk1fUG93ZXIxMCggICBMVk1fRkxPQVQgIFgpOworCitMVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKnBDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBYKTsKKyNpZmRlZiBISUdIRVJfRlMKK0xWTV9GTE9BVCAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICBGYywKKyNlbHNlCitMVk1fRkxPQVQgICBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgRmMsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKKworTFZNX0ZMT0FUIExWTV9GT19MUEYoICAgIExWTV9GTE9BVCAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcyk7CisKK0xWTV9GTE9BVCBMVk1fRk9fSFBGKCAgICBMVk1fRkxPQVQgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpOworI2Vsc2UKIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqcENvZWZmaWNpZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgIFgpOwpAQCAtNTIsNyArNzMsNyBAQAogCiBMVk1fSU5UMzIgICBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgRmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgU2FtcGxlUmF0ZSk7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKaW5kZXggNjhjNTVmNy4uY2IxNWI2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKQEAgLTQ0LDYgKzQ0LDkgQEAKIAogI2RlZmluZSBMVk1fTUFYSU5UXzggICAgICAgICAgICAxMjcgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciBzaXplICovCiAjZGVmaW5lIExWTV9NQVhJTlRfMTYgICAgICAgICAgIDMyNzY3CisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZNX01BWEZMT0FUICAgICAgICAgICAgMS4wZgorI2VuZGlmCiAjZGVmaW5lIExWTV9NQVhJTlRfMzIgICAgICAgICAgIDIxNDc0ODM2NDcKICNkZWZpbmUgTFZNX01BWEVOVU0gICAgICAgICAgICAgMjE0NzQ4MzY0NwogCkBAIC05NSw3ICs5OCw5IEBACiB0eXBlZGVmICAgICBpbnQzMl90ICAgICAgICAgICAgIExWTV9JTlQzMjsgICAgICAgICAgLyogU2lnbmVkIDMyLWJpdCB3b3JkICovCiB0eXBlZGVmICAgICB1aW50MzJfdCAgICAgICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KIAotCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgICAgIGZsb2F0ICAgICAgICAgICAgICAgTFZNX0ZMT0FUOyAgICAgICAgICAvKiBzaW5nbGUgcHJlY2lzc2lvbiBmbG9hdGluZyBwb2ludCovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzMyw2ICsxMzgsMTAgQEAKICAgICBMVk1fRlNfMzIwMDAgPSA2LAogICAgIExWTV9GU180NDEwMCA9IDcsCiAgICAgTFZNX0ZTXzQ4MDAwID0gOCwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICBMVk1fRlNfOTYwMDAgPSA5LAorICAgIExWTV9GU18xOTIwMDAgPSAxMCwKKyNlbmRpZgogICAgIExWTV9GU19JTlZBTElEID0gTFZNX01BWEVOVU0tMSwKICAgICBMVk1fRlNfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fRnNfZW47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaAppbmRleCA4OWRlYjBkLi4wN2M1M2NkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKQEAgLTMwLDYgKzMwLDQzIEBACiAgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUIC8qIEJVSUxEX0ZMT0FUKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQuIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgIC8qIFRhcmdldCB2YWx1ZS4gIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0ZMT0FUICAgQ3VycmVudDsgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgdmFsdWUuICBTZXQgYnkgdGhlIG1peGVyIGZ1bmN0aW9uLiAqLworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0OyAgICAgICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW07ICAgICAgICAgICAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlOyAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTsgICAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworfSBNaXhfMVN0X0NsbF9GTE9BVF90OwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICBBbHBoYTE7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0MTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50MTsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDE7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTE7CisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTE7CisgICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTE7CisgICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazE7CisKKyAgICBMVk1fRkxPQVQgICBBbHBoYTI7ICAgICAgICAgICAgICAgICAgIC8qIFdhcm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhpcyBsb2NhdGlvbiBpcyBwYXNzZWQgYXMgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIE1peF8xU3RfQ2xsX3QgaW4gc29tZSBmdW5jdGlvbnMgKi8KKyAgICBMVk1fRkxPQVQgICBUYXJnZXQyOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQyOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0MjsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtMjsKKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlMjsKKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlMjsKKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMjsKK30gTWl4XzJTdF9DbGxfRkxPQVRfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiAgIEFscGhhOyAgICAgICAgICAgICAgICAgICAgLyogVGltZSBjb25zdGFudC4gU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uICBDYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSAqLwpAQCAtNjQsOSArMTAxLDM1IEBACiAKIH0gTWl4XzJTdF9DbGxfdDsKIAorI2VuZGlmCiAKIC8qKiogR2VuZXJhbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCiAKK0xWTV9GTE9BVCBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICBGcywKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyk7CisKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2Vsc2UKIExWTV9VSU5UMzIgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyICAgdGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyk7CkBAIC04OCwxMCArMTUxLDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKIAorI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTIChMT1cgTEVWRUwgU1VCRlVOQ1RJT05TKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtMTA3LDYgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpAQCAtMTE1LDEzICsxOTUsMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNlbmRpZiAvKiBfX01JWEVSX0hfXyAqLwotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKaW5kZXggM2Q2MjcwNC4uY2RiMzgzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaApAQCAtMzQsNyArMzQsMTIgQEAKIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwogCiAvKiBBYnNvbHV0ZSB2YWx1ZSBpbmNsdWRpbmcgdGhlIGNvcm5lciBjYXNlIGZvciB0aGUgZXh0cmVtZSBuZWdhdGl2ZSB2YWx1ZSAqLworCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCAgIEFic19GbG9hdChMVk1fRkxPQVQgICAgIGlucHV0KTsKKyNlbHNlCiBMVk1fSU5UMzIgICBBYnNfMzIoTFZNX0lOVDMyICAgICBpbnB1dCk7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBOYW1lICAgICAgICA6IGRCX3RvX0xpbjMyKCkKQEAgLTQ4LDggKzUzLDExIEBACiAgKiAgICAgICAgICAgICAgICAgICgxNS0+MDEpID0gZGVjaW1hbCBwYXJ0CiAgKiAgUmV0dXJucyAgICAgOiBMaW4gdmFsdWUgZm9ybWF0IDEuMTYuMTUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBkQl90b19MaW5GbG9hdChMVk1fSU5UMTYgICAgZGJfZml4KTsKKyNlbHNlCiBMVk1fSU5UMzIgZEJfdG9fTGluMzIoTFZNX0lOVDE2ICBkYl9maXgpOworI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCmluZGV4IDJiNzkxYmQuLjBiYTIwYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTI5LDYgKzI5LDExIEBACiAgICAgVkFSSU9VUyBGVU5DVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTG9hZENvbnN0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBMb2FkQ29uc3RfMTYoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKQEAgLTM2LDEwICs0MSwxNyBAQAogdm9pZCBMb2FkQ29uc3RfMzIoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyIHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQ29weV9GbG9hdCggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgQ29weV8xNiggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG5vdGU6IEluIE11bHQzc18xNngxNigpIHNhdHVyYXRpb24gb2YgcmVzdWx0IGlzIG5vdCB0YWtlbiBjYXJlIHdoZW4gICAgICAgICAgICoKQEAgLTQ5LDEwICs2MSwxNyBAQAogICogICAgICAgVGhpcyBpcyB0aGUgb25seSBjYXNlIHdoaWNoIHdpbGwgZ2l2ZSB3cm9uZyByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgKgogICogICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8gVmVjdG9yX0FyaXRobWV0aWMuZG9jIGluIC9kb2MgZm9sZGVyICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNdWx0M3NfRmxvYXQoICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBNdWx0M3NfMTZ4MTYoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBub3RlOiBJbiBNdWx0M3NfMzJ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCkBAIC02NiwyMCArODUsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEZWxheU1peF9GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZGVsYXksICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLCAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKnBPZmZzZXQsICAgICAgIC8qIERlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgIDsgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKyNlbHNlCiB2b2lkIERlbGF5TWl4XzE2eDE2KCAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKIHZvaWQgRGVsYXlXcml0ZV8zMiggICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywgICAgICAgICAgICAgICAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgKnBPZmZzZXQsICAgICAgICAgICAvKiBEZWxheSBvZmZzZXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEFkZDJfU2F0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIEFkZDJfU2F0XzE2eDE2KCAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKQEAgLTg3LDcgKzExNywxMyBAQAogdm9pZCBBZGQyX1NhdF8zMngzMiggICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTWFjM3NfU2F0X0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2Vsc2UKIHZvaWQgTWFjM3NfU2F0XzE2eDE2KCAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LApAQCAtOTcsNyArMTMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgogdm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KQEAgLTEwOSw3ICsxNDUsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgU0hJRlQgRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIFNoaWZ0X1NhdF9GbG9hdCAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbik7CisjZWxzZQogdm9pZCBTaGlmdF9TYXRfdjE2eHYxNiAoICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCkBAIC0xMTksMTEgKzE2MCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIEFVRElPIEZPUk1BVCBDT05WRVJTSU9OIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNb25vVG8ySV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2Vsc2UKIHZvaWQgTW9ub1RvMklfMTYoICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CkBAIC0xMzEsMjkgKzE3Niw1MiBAQAogdm9pZCBNb25vVG8ySV8zMiggICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2Vsc2UKIHZvaWQgRnJvbTJpVG9Nb25vXzMyKCAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTVNUbzJpX1NhdF9GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIE1TVG8yaV9TYXRfMTZ4MTYoICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyY00sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyY1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZyb20yaVRvTVNfRmxvYXQoICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0UywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBGcm9tMmlUb01TXzE2eDE2KCAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdE0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBKb2luVG8yaV9GbG9hdCggICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgRnJvbTJpVG9Nb25vXzE2KCAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KIHZvaWQgSm9pblRvMmlfMzJ4MzIoICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyY0wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBEQVRBIFRZUEUgQ09OVkVSU0lPTiBGVU5DVElPTlMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKaW5kZXggOTIwYjUxNS4uZmE5ZjAxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKQEAgLTMzLDcgKzMzLDEwIEBACiAKICNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBWT0xfVENfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMGYgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIERFQ0FZX0ZBQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NC4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjksNyArNzIsNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwpAQCAtMTkzLDQgKzE5NiwxMTMgQEAKIAogICAgIHJldHVybjsKIH0KKyNlbHNlCit2b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKSAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KK3sKIAorICAgIC8qCisgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNhbXBsZSAqLworICAgIExWTV9GTE9BVCAgICAgICBSaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IHNhbXBsZSAqLworICAgIExWTV9GTE9BVCAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLworCisKKyAgICAvKgorICAgICAqIEluc3RhbmNlIGNvbnRyb2wgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0dhaW4gICAgICA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX01heEdhaW4gICA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47ICAgICAgLyogR2V0IG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfQXR0YWNrICAgID0gcEluc3RhbmNlLT5BR0NfQXR0YWNrOyAgICAgICAvKiBBdHRhY2sgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0RlY2F5ICAgICA9IChwSW5zdGFuY2UtPkFHQ19EZWNheSAqICgxIDw8IChERUNBWV9TSElGVCkpKTsvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5BR0NfVGFyZ2V0OyAgICAgICAvKiBHZXQgdGhlIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9DdXJyZW50ICAgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9UYXJnZXQgICAgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgICAgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9UQyAgICAgICAgPSBwSW5zdGFuY2UtPlZvbHVtZVRDOyAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQgKi8KKworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcworICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOdW1TYW1wbGVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIHNhbXBsZSAqLworICAgIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIHNob3J0IHNjYWxlcnMKKyAgICAgICAgICovCisgICAgICAgIEFHQ19NdWx0ICAgID0gKExWTV9GTE9BVCkoQUdDX0dhaW4pOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCBBR0MgZ2FpbiAqLworICAgICAgICBWb2xfTXVsdCAgICA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgICAgICAgICAgIC8qIEdldCB0aGUgc2hvcnQgdm9sdW1lIGdhaW4gKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgaW5wdXQgc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgTGVmdCAgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGxlZnQgc2FtcGxlICovCisgICAgICAgIFJpZ2h0ID0gKnBTdFNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSByaWdodCBzYW1wbGUgKi8KKyAgICAgICAgTW9ubyAgPSAqcE1vbm9TcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBzdGVyZW8gc2lnbmFsCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4IGluIHRoZSBtb25vIHNpZ25hbCAqLworICAgICAgICBSaWdodCArPSAoTW9ubyAqIEFHQ19NdWx0KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgTGVmdCAgPSBMZWZ0ICAqIFZvbF9NdWx0OworICAgICAgICBSaWdodCA9IFJpZ2h0ICogVm9sX011bHQ7CisgICAgICAgICpwRHN0KysgPSBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworICAgICAgICAqcERzdCsrID0gUmlnaHQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgQWJzUGVhayA9IEFic19GbG9hdChMZWZ0KSA+IEFic19GbG9hdChSaWdodCkgPyBBYnNfRmxvYXQoTGVmdCkgOiBBYnNfRmxvYXQoUmlnaHQpOworICAgICAgICBpZiAoQWJzUGVhayA+IEFHQ19UYXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBsYXJnZSBzbyBkZWNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBR0NfR2FpbiA9IEFHQ19HYWluICogQUdDX0F0dGFjazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8qQlVJTERfRkxPQVQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYwppbmRleCA5MTI4YjgyLi44NGZhYmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYwpAQCAtNDcsNCArNDcsMTQgQEAKICAgICB9CiAgICAgcmV0dXJuIGlucHV0OwogfQotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCAgICBBYnNfRmxvYXQoTFZNX0ZMT0FUICAgIGlucHV0KQoreworICAgIGlmKGlucHV0IDwgIDApCisgICAgeworICAgICAgICAvKiBOZWdhdGl2ZSBpbnB1dCwgc28gaW52ZXJ0ICovCisgICAgICAgIGlucHV0ID0gKExWTV9GTE9BVCkoLWlucHV0KTsKKyAgICB9CisgICAgcmV0dXJuIGlucHV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYwppbmRleCA2OWQzNTdlLi5lM2VkY2NjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKQEAgLTU3LDQgKzU3LDMzIEBACiAgICAgcmV0dXJuOwogfQogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQWRkMl9TYXRfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSAqc3JjKSArICgoTFZNX0ZMT0FUKSAqZHN0KTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgaWYgKFRlbXAgPiAxLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtMS4wMDAwMDBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwppbmRleCBmNGM1NzU3Li44OGY5OTg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKQEAgLTMzLDcgKzMzLDUxIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCiAKKworICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9IChBMCAgKiAoeChuKUwgIC0geChuLTIpTCAgKSApCisgICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogKCgqcERhdGFJbiktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgICogeShuLTEpTCAgKSApCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9eW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC03OCw0ICsxMjIsNSBAQAogICAgICAgICB9CiAKICAgICB9CisjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDg4OTE0YWQuLjI3YWI1N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM4LDYgKzM4LDE5IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHBDb2VmLT5CMTsKK30KKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNDksNiArNjIsNyBAQAogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXBDb2VmLT5CMjsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7CiAgIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggOTgwNTM5Yy4uZTE5NGY5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjcsNCArMjcsMTMgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKl9CUF8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jCmluZGV4IGJhMWE0MmYuLjNhYmRkNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMzMsNyArMzMsNDggQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQoreworICAgIExWTV9GTE9BVCB5bkwsdGVtcGw7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCisgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvLyB5bkw9IChBMCAqICh4KG4pTCAtIHgobi0yKUwgKSkKKyAgICAgICAgdGVtcGwgPSAoTFZNX0ZMT0FUKSAqcERhdGFJbiAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOworCisgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQorICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApKQorICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFExNgorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAqcERhdGFPdXQrKyA9ICh5bkwpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorICAgICAgICB9Cit9CisjZWxzZQogdm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtODAsNCArMTIxLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwppbmRleCBlODMzMjE4Li5kNmUwNDdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC00OCw2ICs0OCwyMCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fRkxPQVQgKikgcFRhcHM7CisKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSAgcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSAgcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSAgcENvZWYtPkIxOworfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01OSw2ICs3Myw3IEBACiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSAgcENvZWYtPkIyOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gIHBDb2VmLT5CMTsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggOWNjYTYyNy4uYWE5ZTY2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjYsNSArMjYsMTIgQEAKIH1GaWx0ZXJfU3RhdGU7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0Zsb2F0OwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMKaW5kZXggYjA5YzFhYS4uYWJkYjJmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jCkBAIC0zMyw3ICszMyw1MiBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQorICAgICAgICAgICAgdGVtcGwgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgICogeShuLTEpTCAgKSApCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0geW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC03OCw0ICsxMjMsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jCmluZGV4IDkzNjc5MTIuLjU1OTBjMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMKQEAgLTM3LDYgKzM3LDIxIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0ZMT0FUICopIHBUYXBzOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHBDb2VmLT5BMDsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOworfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01MCw2ICs2NSw3IEBACiAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCmluZGV4IDVjYzFjZTIuLjgwYzM5MjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKQEAgLTI2LDUgKzI2LDEzIEBACiB9RmlsdGVyX1N0YXRlOwogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRmxvYXQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKIAogI2VuZGlmIC8qX0JQXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAyX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKaW5kZXggZjJmOGM2Yi4uZWU5YmY3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCkBAIC0zMiw3ICszMiw1NiBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIyICAqIHkobi0yKUwgKQorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5MKz0gKC1CMSAgKiB5KG4tMSlMICApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorCisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTgyLDQgKzEzMSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggYmFmMGMxYS4uM2Q1YmVmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHMgOworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTYsNiArNzYsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA5MDljNjk5Li44MTFkYThiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNyw0ICsyNywxMyBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qX0JRXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCmluZGV4IDkyZjZjYWYuLmM3NGExMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYwpAQCAtMzIsNyArMzIsNTQgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAoLUIyICAqIHkobi0yKUwgKQorICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8vIHluTCs9IC1CMSAgKiB5KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCkoeW5MKTsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKworICAgICAgICB9CisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTgxLDQgKzEyOCw0IEBACiAKICAgICAgICAgfQogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggYWVhMTBmMC4uOTgxMjI3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjcsNCArMjcsMTMgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLypfQlFfMUlfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKaW5kZXggMWQ2YmU0ZS4uZmVhZTIwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpAQCAtMzgsNiArMzgsMjcgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKilwVGFwczsKKworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTcsNiArNzgsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwppbmRleCA5NzJlNzA0Li45YjBmZGUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKQEAgLTM3LDcgKzM3LDgxIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICggLUIyICAqIHkobi0yKUwgICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisKKyAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgICogeShuLTEpTCApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOworCisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5SPUEyICAqIHgobi0yKVIKKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMSAgKiB4KG4tMSlSCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8vIHluUis9ICggLUIyICAqIHkobi0yKVIgICkKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107CisKKyAgICAgICAgICAgIC8vIHluUis9KCAtQjEgICogeShuLTEpUiAgKQorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLy8geChuLTIpUj14KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0CisKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTEyLDMgKzE4Niw0IEBACiAKICAgICB9CiAKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCmluZGV4IGUwNTYzNzMuLmYyNGRiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpAQCAtMzcsNyArMzcsODEgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAgKiB5KG4tMilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOworCisgICAgICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5blI9QTIgICogeChuLTIpUgorICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5blIrPUExICAqIHgobi0xKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgICogeShuLTIpUiAgKQorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKworICAgICAgICAgICAgLy8geW5SKz0oIC1CMSAgKiB5KG4tMSlSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTExLDQgKzE4NSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggMGE4YWMzNS4uMzllMWJkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzgsNiArMzgsMjcgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgICB0ZW1wID0gcENvZWYtPkEyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU3LDYgKzc4LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggN2Q0MmNlZC4uMDY5MWI4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjgsNCArMjgsMTQgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICBwRGVsYXlzOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAqLworICAgIExWTV9GTE9BVCAgICAgY29lZnNbNV07ICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCisKICNlbmRpZiAvKiBfQlFfMklfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMKaW5kZXggNGEwY2NlNC4uNjFjMDdjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCkBAIC0zNyw3ICszNyw3OSBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyICogeChuLTIpTCAqLworICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExKiB4KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwKiB4KG4pTCAgICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0tQjIqeShuLTIpTCAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluTCs9LUIxKnkobi0xKUwgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgKiB4KG4tMilSICovCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEqIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAqIHgobilSICAgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0tQjIgKiB5KG4tMilSICovCisgICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5SKz0tQjEgKiB5KG4tMSlSICovCisgICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE1LDQgKzE4Nyw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYwppbmRleCAwNTJlMmEwLi5jZjE5ZTA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKQEAgLTM2LDcgKzM2LDgyIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICApKSovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAgKiB5KG4tMSlMICApKSAgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgICogeChuLTIpUiAqLworICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExICAqIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgICogeChuKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyICAqIHkobi0yKVIgICkpKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSAgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExNCw0ICsxODksNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKaW5kZXggOGM3NDFlMS4uMjYxMWIxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jCkBAIC0zNiw3ICszNiw4NCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkgICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAgKiB5KG4tMSlMICApKSAgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAgKiB4KG4tMilSICovCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEgICogeChuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCAgKiB4KG4pUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgICogeShuLTIpUiApICovCisgICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworCisgICAgICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSBpbiBRMTUgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgLyogVXBkYXRlIHkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExNCw0ICsxOTEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDRmMGNmNjcuLmMwMzE5YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI4LDQgKzI4LDE0IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKaW5kZXggNDU5MWVlMC4uNGQ5YmJmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpAQCAtMzcsNiArMzcsMjYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Niw2ICs3Niw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCmluZGV4IGZkODIxMmU0Li45NjBkZTc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKQEAgLTM2LDcgKzM2LDk0IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQogCisKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5bkwseW5SLHRlbXBsLHRlbXBkOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD0gKCBBMiAgKiB4KG4tMilMICApICovCisgICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPSAoIEExICAqIHgobi0xKUwgICkqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoIEEwICAqIHgobilMICApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAgLyogeW5MKz0gKC1CMiAgKiB5KG4tMilMICApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgtQjEgICogeShuLTEpTCAgKSovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj0gKCBBMiAgKiB4KG4tMilSICApICovCisgICAgICAgICAgICB5blIgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPSAoIEExICAqIHgobi0xKVIgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKCBBMCAgKiB4KG4pUiAgKSAqLworICAgICAgICAgICAgdGVtcGQgPSogKHBEYXRhSW4rMSk7CisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiB0ZW1wZDsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMiAgKiB5KG4tMilSICApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107CisgICAgICAgICAgICB5blIgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICgtQjEgICogeShuLTEpUiAgKSAgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0gKExWTV9GTE9BVCl5blI7IC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSAoTFZNX0ZMT0FUKXluTDsgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMICovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpeW5MOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpeW5SOyAvKiBXcml0ZSBSaWdodCBvdXB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKworCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTIzLDQgKzIxMCw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmIC8qQlVJTERfRkxPQVQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDE3MDlmNzEuLmZmZjA1ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM3LDYgKzM3LDI2IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTYsNiArNzYsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QzMkYzMkMzMl9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA3NDdhZjZhLi5jMGYwZGNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOSw0ICsyOSwxNCBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCmluZGV4IDIwNDA0YWQuLmU0ODkwMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKQEAgLTU0LDUgKzU0LDM1IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQ29weV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9JTlQxNiBpaTsKIAorICAgIGlmIChzcmMgPiBkc3QpCisgICAgeworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNyYyArPSBuIC0gMTsKKyAgICAgICAgZHN0ICs9IG4gLSAxOworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgICAgICBkc3QtLTsKKyAgICAgICAgICAgIHNyYy0tOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKaW5kZXggYmY2OWUzNS4uZWE5ODA0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKQEAgLTI1LDcgKzI1LDM3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gQ09SRV9NSVhIQVJEXzJTVF9EMzJDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICBUZW1wMSxUZW1wMixUZW1wMzsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQxU2hvcnQ7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQyU2hvcnQ7CiAKKyAgICBDdXJyZW50MVNob3J0ID0gKHBJbnN0YW5jZS0+Q3VycmVudDEpOworICAgIEN1cnJlbnQyU2hvcnQgPSAocEluc3RhbmNlLT5DdXJyZW50Mik7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAxID0gKnNyYzErKzsKKyAgICAgICAgVGVtcDMgPSBUZW1wMSAqIEN1cnJlbnQxU2hvcnQ7CisgICAgICAgIFRlbXAyID0gKnNyYzIrKzsKKyAgICAgICAgVGVtcDEgPSBUZW1wMiAqIEN1cnJlbnQyU2hvcnQ7CisgICAgICAgIFRlbXAyID0gKFRlbXAxIC8gMi4wZikgKyAoVGVtcDMgLyAyLjBmKTsKKyAgICAgICAgaWYgKFRlbXAyID4gMC41ZikKKyAgICAgICAgICAgIFRlbXAyID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcDIgPCAtMC41ZiApCisgICAgICAgICAgICBUZW1wMiA9IC0xLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBUZW1wMiA9IChUZW1wMiAqIDIpOworICAgICAgICAgICAgKmRzdCsrID0gVGVtcDI7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLApAQCAtNTUsNiArODUsNSBAQAogICAgICAgICAgICAgKmRzdCsrID0gVGVtcDI7CiAgICAgfQogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKaW5kZXggMzQ3MWYwNS4uMjgxNGYxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwpAQCAtMjYsNiArMjYsNzAgQEAKICAgIEZVTkNUSU9OIENPUkVfTUlYU09GVF8xU1RfRDMyQzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVCAvKiBCVUlMRF9GTE9BVCAqLwordm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9GTE9BVCAgICBUZW1wMSxUZW1wMixUZW1wMzsKKyAgICBMVk1fSU5UMTYgICAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgICBJbkxvb3A7CisgICAgTFZNX0ZMT0FUICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0ZMT0FUICAgIEN1cnJlbnRUaW1lc0FscGhhOworICAgIExWTV9JTlQxNiAgICAgaWksamo7CisKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhID0gKCgxLjBmIC1wSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0KTsKKyAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KXsKKyAgICAgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArPShMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCisgICAgfQorCisgICAgaWYgKE91dExvb3ApeworCisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDEgPSAqc3JjKys7CisgICAgICAgIFRlbXAyID0gKmRzdDsKKworICAgICAgICBUZW1wMyA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgIFRlbXAxID0gVGVtcDIgKyBUZW1wMzsKKworICAgICAgICBpZiAoVGVtcDEgPiAxLjBmKQorICAgICAgICAgICAgVGVtcDEgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0xLjBmKQorICAgICAgICAgICAgVGVtcDEgPSAtMS4wZjsKKworICAgICAgICAqZHN0KysgPSBUZW1wMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworCisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgIGZvciAoamogPSA0OyBqaiE9MCA7IGpqLS0peworICAgICAgICAgICAgVGVtcDEgPSAqc3JjKys7CisgICAgICAgICAgICBUZW1wMiA9ICpkc3Q7CisKKyAgICAgICAgICAgIFRlbXAzID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgIFRlbXAxID0gVGVtcDIgKyBUZW1wMzsKKworICAgICAgICAgICAgaWYgKFRlbXAxID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wMSA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAxID0gLTEuMGY7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCiB2b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC04OSw2ICsxNTMsNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCmluZGV4IDcwOWMzMDQuLjgxNGNjZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCkBAIC0yNSw3ICsyNSw3OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIENPUkVfTUlYU09GVF8xU1RfRDMyQzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgVGVtcDEsVGVtcDI7CisgICAgTFZNX0lOVDE2IE91dExvb3A7CisgICAgTFZNX0lOVDE2IEluTG9vcDsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudFRpbWVzQWxwaGE7CiAKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSA9ICgxLjBmIC0gcEluc3RhbmNlLT5BbHBoYSkgKiBwSW5zdGFuY2UtPlRhcmdldDsgLyogZmxvYXQgKiBmbG9hdCBpbiBmbG9hdCAqLworICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpCisgICAgeworICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9IChMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCisgICAgfQorCisgICAgaWYgKE91dExvb3AgIT0gMCkKKyAgICB7CisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gKHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGEpOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7CisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKKworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtOTgsNiArMTcwLDUgQEAKICAgICAgICAgICAgIGRzdCsrOwogICAgIH0KIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKaW5kZXggNDlmYTE4NC4uZDI2MWM5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCkBAIC0xOCw3ICsxOCw1MyBAQAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCBMZWZ0REMsUmlnaHREQzsKKyAgICAgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgTGVmdERDID0gcEJpcXVhZFN0YXRlLT5MZWZ0REM7CisgICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7CisgICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLworICAgICAgICAgICAgRGlmZiA9KiAocERhdGFJbisrKSAtIChMZWZ0REMpOworICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7IH0KKyAgICAgICAgICAgIGVsc2UgaWYgKERpZmYgPCAtMS4wZikgeworICAgICAgICAgICAgICAgIERpZmYgPSAtMS4wZjsgfQorICAgICAgICAgICAgKihwRGF0YU91dCsrKSA9IChMVk1fRkxPQVQpRGlmZjsKKyAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgIExlZnREQyAtPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMZWZ0REMgKz0gRENfRkxPQVRfU1RFUDsgfQorCisKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICBEaWZmID0qIChwRGF0YUluKyspIC0gKFJpZ2h0REMpOworICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7IH0KKyAgICAgICAgICAgIGVsc2UgaWYgKERpZmYgPCAtMS4wZikgeworICAgICAgICAgICAgICAgIERpZmYgPSAtMS4wZjsgfQorICAgICAgICAgICAgKihwRGF0YU91dCsrKSA9IChMVk1fRkxPQVQpRGlmZjsKKyAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgIFJpZ2h0REMgLT0gRENfRkxPQVRfU1RFUDsgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyArPSBEQ19GTE9BVF9TVEVQOyB9CisKKyAgICAgICAgfQorICAgICAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyA9IExlZnREQzsKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDID0gUmlnaHREQzsKKworCisgICAgfQorI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTY0LDQgKzExMCw0IEBACiAKIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggNDY4YTg4ZC4uNGY0ZmNkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMTcsMTEgKzE3LDE4IEBACiAKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJEQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCit7CisgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZSBwQmlxdWFkU3RhdGUgID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGUpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyAgICAgICAgPSAwLjBmOworICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgICAgICA9IDAuMGY7Cit9CisjZWxzZQogdm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCiB7CiAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKICAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyAgICAgICAgPSAwOwogICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgICAgICA9IDA7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDg5YTRlNjguLmZhNmI3MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTE4LDExICsxOCwyMyBAQAogI2lmbmRlZiBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXwogI2RlZmluZSBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgRENfRkxPQVRfU1RFUCAgIDAuMDAwMDAwMjM4NGY7CisjZWxzZQogI2RlZmluZSBEQ19EMTZfU1RFUCAgICAgMHgyMDA7CisjZW5kaWYKIAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlXworeworICAgIExWTV9GTE9BVCAgTGVmdERDOyAgICAgLyogTGVmdERDICAqLworICAgIExWTV9GTE9BVCAgUmlnaHREQzsgICAgLyogUmlnaHREQyAgKi8KK31GaWx0ZXJfRkxPQVRfU3RhdGU7Cit0eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZSAqIFBGaWx0ZXJfRkxPQVRfU3RhdGUgOworI2Vsc2UKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CiAgIExWTV9JTlQzMiAgTGVmdERDOyAgICAgLyogTGVmdERDICAqLwpAQCAtMzAsNSArNDIsNSBAQAogfUZpbHRlcl9TdGF0ZTsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQorI2VuZGlmCiAjZW5kaWYgLyogX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jCmluZGV4IDdlMzE4MmQuLmY1MDI3MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYwpAQCAtMzYsMTAgKzM2LDU1IEBACiAgICAgTFZNX0lOVDE2ICAgT2Zmc2V0ICA9ICpwT2Zmc2V0OwogICAgIExWTV9JTlQxNiAgIHRlbXA7CiAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgICAgLyogTGVmdCBjaGFubmVsICovCisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgKyAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgZHN0Kys7CisKKyAgICAgICAgZGVsYXlbT2Zmc2V0XSA9ICpzcmM7CisgICAgICAgIE9mZnNldCsrOworICAgICAgICBzcmMrKzsKKworCisgICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSAtIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICAqcE9mZnNldCA9IE9mZnNldDsKKworICAgIHJldHVybjsKK30KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEZWxheU1peF9GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZGVsYXksICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLCAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKnBPZmZzZXQsICAgICAgIC8qIERlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworeworICAgIExWTV9JTlQxNiAgIGk7CisgICAgTFZNX0lOVDE2ICAgT2Zmc2V0ICA9ICpwT2Zmc2V0OworICAgIExWTV9GTE9BVCAgIHRlbXA7CisKICAgICBmb3IgKGk9MDsgaTxuOyBpKyspCiAgICAgewogICAgICAgICAvKiBMZWZ0IGNoYW5uZWwgKi8KLSAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpICsgKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKKyAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVCkoKmRzdCArIChMVk1fRkxPQVQpZGVsYXlbT2Zmc2V0XSkgLyAyLjBmKTsKICAgICAgICAgKmRzdCAgICAgICAgICAgID0gdGVtcDsKICAgICAgICAgZHN0Kys7CiAKQEAgLTQ5LDcgKzk0LDcgQEAKIAogCiAgICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KLSAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpIC0gKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKKyAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVCkoKmRzdCAtIChMVk1fRkxPQVQpZGVsYXlbT2Zmc2V0XSkgLyAyLjBmKTsKICAgICAgICAgKmRzdCAgICAgICAgICAgID0gdGVtcDsKICAgICAgICAgZHN0Kys7CiAKQEAgLTY5LDUgKzExNCw1IEBACiAKICAgICByZXR1cm47CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwppbmRleCBkZTc3MzYxLi4wMzljODhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKQEAgLTMxLDYgKzMxLDQ2IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtNzEsNCArMTExLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCA5NjI1MmNjLi5iMjFiOGE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zOCw2ICszOCwyMiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKilwVGFwczsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTMsNiArNjksNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA1MTZjYTgzLi42ZmRiMDM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOCw0ICsyOCwxNCBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLyogX0ZPXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCmluZGV4IDBmMWQ1YmMuLjQxNmU4ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYwpAQCAtMzEsNyArMzEsNDcgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwsdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiAgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC03MSw0ICsxMTEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDEzNmU0ZjYuLmYzM2QyNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM3LDYgKzM3LDIzIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSAgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSAgICBwVGFwczsKKworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Miw2ICs2OSw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDk0YWQ0OGMuLmZkYjUyOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI5LDQgKzI5LDEzIEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVF8KK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKaW5kZXggODM4ODA1MC4uMTkyOTI3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwpAQCAtMzIsNyArMzIsOTIgQEAKIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMSlSIGluIFExNSBmb3JtYXQKIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMSlSIGluIFEzMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgIHluTCx5blI7CisgICAgICAgIExWTV9GTE9BVCAgIFRlbXA7CisgICAgICAgIExWTV9GTE9BVCAgIE5lZ1NhdFZhbHVlOworICAgICAgICBMVk1fSU5UMTYgICBpaTsKIAorICAgICAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTmVnU2F0VmFsdWUgPSAtMS4wZjsKKworICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvLyB5bkwgPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKyAgICAgICAgICAgIC8vIHluUiA9QTEgICogeChuLTEpUgorICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgLy8geW5SKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqKHBEYXRhSW4rMSkpOworCisKKyAgICAgICAgICAgIC8vIHluTCArPSAgKC1CMSAgKiB5KG4tMSlMICApCisgICAgICAgICAgICBUZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluTCArPSBUZW1wOworICAgICAgICAgICAgLy8geW5SICs9ICAoLUIxICAqIHkobi0xKVIgKSApCisgICAgICAgICAgICBUZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluUiArPSBUZW1wOworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0geW5SOyAvLyBVcGRhdGUgeShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpUgorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgICAgIGlmKHluTCA+IDEuMGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeW5MID0gMS4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih5bkwgPCBOZWdTYXRWYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHluTCA9IE5lZ1NhdFZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoeW5SID4gMS4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5blIgPSAxLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHluUiA8IE5lZ1NhdFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTEyNSw0ICsyMTAsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYwppbmRleCBhMTljMzJjLi4zM2NhNmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzICAgICAgICAgICAgOworCisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfTFNoeF9Db2Vmc190ICAgICAgICAqcENvZWYpCkBAIC01NSw2ICs3Miw3IEBACiAgIHRlbXA9cENvZWYtPlNoaWZ0OwogICBwQmlxdWFkU3RhdGUtPlNoaWZ0ID0gdGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggNDY0MDc0My4uMzY4YmZjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTIwLDYgKzIwLDE1IEBACiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgICBMVk1fRkxPQVQgICAgICpwRGVsYXlzOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfRmxvYXRfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX0Zsb2F0X1N0YXRlICogUEZpbHRlcl9GbG9hdF9TdGF0ZSA7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKICAgTFZNX0lOVDMyICAgICAqcERlbGF5czsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KQEAgLTI4LDUgKzM3LDUgQEAKIH1GaWx0ZXJfU3RhdGU7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KKyNlbmRpZgogI2VuZGlmIC8qIF9GT18ySV9EMTZGMzJDU1NfTFNIWF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaAppbmRleCA0ZDMyZGYxLi5iMWZkZTBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCkBAIC0zNCw2ICszNCw3IEBACiAgKiBCaXF1YWQgd2l0aCBjb2VmZmljaWVudHMgQTAsIEExLCBBMiwgQjEgYW5kIEIyIGNvZWZmaWNpZW50cwogICovCiAvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAgICAgTFZNX0lOVDE2ICAgQTA7CkBAIC00MywxMiArNDQsMjIgQEAKICAgICAgICAgTFZNX0lOVDE2ICAgQjI7CiAgICAgICAgIExWTV9VSU5UMTYgIFNjYWxlOwogfSBCaXF1YWRBMDEyQjEyQ29lZnNTUF90OwotCi0KKyNlbHNlCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgIEEwOworICAgIExWTV9GTE9BVCAgIEExOworICAgIExWTV9GTE9BVCAgIEEyOworICAgIExWTV9GTE9BVCAgIEIxOworICAgIExWTV9GTE9BVCAgIEIyOworICAgIExWTV9VSU5UMTYgIFNjYWxlOworfSBCaXF1YWRBMDEyQjEyQ29lZnNTUF90OworI2VuZGlmCiAvKgogICogQmlxdWFkIHdpdGggY29lZmZpY2llbnRzIEEwLCBBMSBhbmQgQjEgY29lZmZpY2llbnRzCiAgKi8KIC8qIFNpbmdsZSBwcmVjaXNpb24gKDE2LWJpdCkgQmlxdWFkIHNlY3Rpb24gY29lZmZpY2llbnRzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgICAgICBMVk1fSU5UMTYgICBBMDsKQEAgLTU2LDggKzY3LDE1IEBACiAgICAgICAgIExWTV9JTlQxNiAgIEIxOwogICAgICAgICBMVk1fVUlOVDE2ICBTY2FsZTsKIH0gQmlxdWFkQTAxQjFDb2Vmc1NQX3Q7Ci0KLQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgQTA7CisgICAgTFZNX0ZMT0FUICAgQTE7CisgICAgTFZNX0ZMT0FUICAgQjE7CisgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMUIxQ29lZnNTUF90OworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jCmluZGV4IDc5NzVlOGIuLjJjNmU2YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKQEAgLTUzLDUgKzUzLDM0IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRnJvbTJpVG9NU19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3RNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9GTE9BVCB0ZW1wMSxsZWZ0LHJpZ2h0OworICAgIExWTV9JTlQxNiBpaTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGxlZnQgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgIHNyYysrOwogCisgICAgICAgIHJpZ2h0ID0gKExWTV9GTE9BVCkqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICAvKiBDb21wdXRlIE0gc2lnbmFsKi8KKyAgICAgICAgdGVtcDEgPSAgKGxlZnQgKyByaWdodCkgLyAyLjBmOworICAgICAgICAqZHN0TSA9IChMVk1fRkxPQVQpdGVtcDE7CisgICAgICAgIGRzdE0rKzsKKworICAgICAgICAvKiBDb21wdXRlIFMgc2lnbmFsKi8KKyAgICAgICAgdGVtcDEgPSAgKGxlZnQgLSByaWdodCkgLyAyLjBmOworICAgICAgICAqZHN0UyA9IChMVk1fRkxPQVQpdGVtcDE7CisgICAgICAgIGRzdFMrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYwppbmRleCA4YmIyOTJmLi5hYzFlZWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYwpAQCAtNDYsNSArNDYsMjcgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgVGVtcDsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgqc3JjKTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgVGVtcCArPSAoKnNyYyk7CisgICAgICAgIHNyYysrOworCisgICAgICAgICpkc3QgPSBUZW1wIC8gMi4wZjsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jCmluZGV4IDliOTM4YmQuLmViYzQ3N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYwpAQCAtNDksNiArNDksMzEgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBKb2luVG8yaV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAgICpzcmNMLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmNSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOwogCisgICAgc3JjTCArPSBuIC0gMTsKKyAgICBzcmNSICs9IG4gLSAxOworICAgIGRzdCAgKz0gKCgyICogbikgLSAxKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmNSOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjUi0tOworCisgICAgICAgICpkc3QgPSAqc3JjTDsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyY0wtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKaW5kZXggM2QzOWI5My4uZWI1NzU1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYwpAQCAtMjcsNyArMjcsMzkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICBUZW1wOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpcEluc3RhbmNlMS0+Q3VycmVudCk7CisgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CiAKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UyLT5DdXJyZW50KTsKKyAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICB9CisKKworfQorI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKQEAgLTY2LDQgKzk4LDUgQEAKIAogCiB9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jCmluZGV4IDJkYWY3NGEuLmVjMGJhYWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMKQEAgLTI0LDcgKzI0LDM3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDb3JlX01JWEhBUkRfMlNUX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCBDdXJyZW50MTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDI7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CiAKKworICAgIEN1cnJlbnQxID0gKHBJbnN0YW5jZTEtPkN1cnJlbnQpOworICAgIEN1cnJlbnQyID0gKHBJbnN0YW5jZTItPkN1cnJlbnQpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0peworICAgICAgICBUZW1wID0gKCgoTFZNX0ZMT0FUKSooc3JjMSsrKSAqIChMVk1fRkxPQVQpQ3VycmVudDEpKSArCisgICAgICAgICAgICAgICAoKChMVk1fRkxPQVQpKihzcmMyKyspICogKExWTV9GTE9BVClDdXJyZW50MikpOworICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcHRySW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMSwKQEAgLTU0LDYgKzg0LDUgQEAKICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKICAgICB9CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCmluZGV4IGNhYTA5NTEuLmQyNjk0Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMjUsNyArMjUsOTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKIAorICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpLGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmKEN1cnJlbnQgPCBUYXJnZXQpeworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSA0OyBqaiAhPSAwIDsgamotLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqICE9IDAgOyBqai0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudDsKK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCkBAIC0xMjMsNiArMjEyLDUgQEAKICAgICB9CiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYwppbmRleCAwOWVjNDI3Li42NTZhMTE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCkBAIC0yNiw3ICsyNiwxMjcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorc3RhdGljIExWTV9GTE9BVCBBREQyX1NBVF9GTE9BVChMVk1fRkxPQVQgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCBjKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIHRlbXAgPSBhICsgYiA7CisgICAgaWYgKHRlbXAgPCAtMS4wZikKKyAgICAgICAgYyA9IC0xLjBmOworICAgIGVsc2UgaWYgKHRlbXAgPiAxLjBmKQorICAgICAgICBjID0gMS4wZjsKKyAgICBlbHNlCisgICAgICAgIGMgPSB0ZW1wOworICAgIHJldHVybiBjOworfQordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCit7CisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VMID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VSID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBMVk1fRkxPQVQgICBEZWx0YUwgPSBwSW5zdGFuY2VMLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50TCA9IHBJbnN0YW5jZUwtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0TCA9IHBJbnN0YW5jZUwtPlRhcmdldDsKKworICAgIExWTV9GTE9BVCAgIERlbHRhUiA9IHBJbnN0YW5jZVItPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnRSID0gcEluc3RhbmNlUi0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRSID0gcEluc3RhbmNlUi0+VGFyZ2V0OworCisgICAgTFZNX0ZMT0FUICAgVGVtcCA9IDA7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYgKE91dExvb3ApCisgICAgeworICAgICAgICBpZihDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRMLCBEZWx0YUwsIFRlbXApOworICAgICAgICAgICAgQ3VycmVudEwgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudFIsIERlbHRhUiwgVGVtcCk7CisgICAgICAgICAgICBDdXJyZW50UiA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPiBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRSIC09IERlbHRhUjsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3AgKiAyOyBpaSAhPSAwOyBpaSAtPSAyKQorICAgICAgICB7CisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaWkgPSBJbkxvb3AgKiAyOyBpaSAhPSAwOyBpaS09MikKKyAgICB7CisgICAgICAgIGlmKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudEwsIERlbHRhTCwgVGVtcCk7CisgICAgICAgICAgICBDdXJyZW50TCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisKKyAgICAgICAgaWYoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50UiwgRGVsdGFSLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRSID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgIH0KKyAgICBwSW5zdGFuY2VMLT5DdXJyZW50ID0gQ3VycmVudEw7CisgICAgcEluc3RhbmNlUi0+Q3VycmVudCA9IEN1cnJlbnRSOworCit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLApAQCAtMTQwLDQgKzI2MCw1IEBACiAgICAgcEluc3RhbmNlUi0+Q3VycmVudD1DdXJyZW50UjsKIAogfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwppbmRleCBmMWE5Y2EzLi5iNWU3ZjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCkBAIC0yNiw3ICsyNiw4NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YT0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUICAgVGVtcDsKIAorICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBpZihDdXJyZW50PFRhcmdldCl7CisgICAgICAgIGlmIChPdXRMb29wKXsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7Cit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCkBAIC0xMDEsNiArMTgwLDUgQEAKICAgICB9CiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggMDA1MmRkNy4uMTkyZjEyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTMzLDcgKzMzLDgwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKXsKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgbik7CisgICAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aGUgTFZDb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKyNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCkBAIC0xMDgsNSArMTgxLDUgQEAKICAgICB9CiAKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jCmluZGV4IGY0NDNjOGYuLmJkNWE5MjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYwpAQCAtMzMsNyArMzMsMTM4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UxLT5EZWx0YSA9PSAxLjBmKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZihIYXJkTWl4aW5nID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJbnN0YW5jZTItPkRlbHRhID09IDEuMGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihIYXJkTWl4aW5nID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpCisgICAgeworICAgICAgICBpZiAoKHBJbnN0YW5jZTEtPlRhcmdldCA9PSAxLjBmKSAmJiAocEluc3RhbmNlMi0+VGFyZ2V0ID09IDEuMGYpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihzcmMgIT0gZHN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KQorICAgIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LApAQCAtMTQ4LDUgKzI3OSw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYwppbmRleCBjOGRjYWQ3Li4xMDE3ZGUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKQEAgLTMzLDcgKzMzLDc3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZNaXhlcjNfTUlYU09GVF8xU1RfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgbik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgIT0gMS4wZikKKyAgICAgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIG4pOworICAgICAgICAgICAgZWxzZSBpZihzcmMgIT0gZHN0KQorICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwKQEAgLTEwNyw1ICsxNzcsNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYvKkJVSUxEX0ZMT0FUKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKaW5kZXggNzI0MDcwNS4uM2M5MDA3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCkBAIC0yNSw3ICsyNSw0OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ID09IHBJbnN0YW5jZTEtPlRhcmdldCkgJiYgKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gMCkpeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSl7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOworICAgICAgICBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgIEhBUkQgTUlYSU5HCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICpzcmMyLApAQCAtNjYsNSArMTA4LDUgQEAKICAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQotCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggOTgwYzc4My4uZjkwNDkxNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTMxLDYgKzMxLDE5IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogTFZNaXhlcjNfc3Qgc3RydWN0dXJlIHN0b3JlcyBJbnN0YW5jZSBwYXJhbWV0ZXJzIGZvciBvbmUgYXVkaW8gc3RyZWFtICovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgICAgIFByaXZhdGVQYXJhbXNbM107ICAgLyogUHJpdmF0ZSBJbnN0YW5jZSBwYXJhbXMgZm9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gc2hpZnQgcGFyYW1ldGVyICovCisgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrU2V0OyAgICAgICAgLyogQm9vbGVhbi4gIFNob3VsZCBiZSBzZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiAgICAgICBDYWxsYmFja1BhcmFtOyAgICAgIC8qIFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY2FsYmFjayBmdW5jdGlvbiAqLworICAgIHZvaWQgICAgICAgICAgICAqcENhbGxiYWNrSGFuZGxlOyAgIC8qIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgIHZvaWQgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayAgICBwQ2FsbEJhY2s7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCit9IExWTWl4ZXIzX0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyICAgICAgIFByaXZhdGVQYXJhbXNbNF07ICAgLyogUHJpdmF0ZSBJbnN0YW5jZSBwYXJhbXMgZm9yIEF1ZGlvIFN0cmVhbSAqLwpAQCAtNDAsMjIgKzUzLDM1IEBACiAgICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCiAgICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KIH0gTFZNaXhlcjNfc3Q7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICBNaXhlclN0cmVhbVsxXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciBvbmUgQXVkaW8gU3RyZWFtICovCit9IExWTWl4ZXIzXzFTdF9GTE9BVF9zdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTWl4ZXIzX3N0ICAgICBNaXhlclN0cmVhbVsxXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciBvbmUgQXVkaW8gU3RyZWFtICovCiB9IExWTWl4ZXIzXzFTdF9zdDsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCit9IExWTWl4ZXIzXzJTdF9GTE9BVF9zdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTWl4ZXIzX3N0ICAgICBNaXhlclN0cmVhbVsyXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciB0d28gQXVkaW8gU3RyZWFtcyAqLwogfSBMVk1peGVyM18yU3Rfc3Q7Ci0KKyNlbmRpZgorI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1peGVyM19zdCAgICAgTWl4ZXJTdHJlYW1bM107ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdGhyZWUgQXVkaW8gU3RyZWFtcyAqLwogfSBMVk1peGVyM18zU3Rfc3Q7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgKEhJR0ggTEVWRUwgRlVOQ1RJT05TKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03NSw1NyArMTAxLDExNSBAQAogLyogdGhlbiB0aGUgY2FsY3VsYXRpb24gd2lsbCBnaXZlIGFuIGluY29ycmVjdCB2YWx1ZSBmb3IgYWxwaGEsIHNlZSB0aGUgbWl4ZXIgICAgICovCiAvKiBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgIFRhcmdldEdhaW4pOworI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRhcmdldCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2Fpbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pOworI2Vsc2UKIExWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19zdCAqcFN0cmVhbSk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKTsKKyNlbHNlCiBMVk1fSU5UMzIgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50R2Fpbik7CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2FpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBDdXJyZW50R2Fpbik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2Vsc2UKIHZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2VuZGlmCiAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGb3IgYXBwbHlpbmcgZGlmZmVyZW50IGdhaW5zIHRvIExlZnQgYW5kIHJpZ2h0IGNoZW5uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE1peGVyU3RyZWFtWzBdIGFwcGxpZXMgdG8gTGVmdCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTWl4ZXJTdHJlYW1bMV0gYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOyAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi0KLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMKaW5kZXggYjVhZTI2NC4uNTk5MDQxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jCkBAIC0zMSw3ICszMSwxNSBAQAogLyogIEN1cnJlbnRHYWluICAgICAgLSBDdXJyZW50R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCit7CisgICAgTFZNX0ZMT0FUICAgICAgIEN1cnJlbnRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBDdXJyZW50R2FpbiA9IHBJbnN0YW5jZS0+Q3VycmVudDsgIC8vIEN1cnJlbnRHYWluCisgICAgcmV0dXJuIEN1cnJlbnRHYWluOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pCiB7CiAgICAgTFZNX0lOVDMyICAgICAgIEN1cnJlbnRHYWluOwpAQCAtMzksMyArNDcsNCBAQAogICAgIEN1cnJlbnRHYWluPXBJbnN0YW5jZS0+Q3VycmVudD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gQ3VycmVudEdhaW4gaW4gUTE2LjE1IGZvcm1hdAogICAgIHJldHVybiBDdXJyZW50R2FpbjsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCmluZGV4IGRjMmY4ZTkuLmM2NzQ1NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKQEAgLTMwLDcgKzMwLDE2IEBACiAvKiAgVGFyZ2V0R2FpbiAgICAgIC0gVGFyZ2V0R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKQoreworICAgIExWTV9GTE9BVCAgICAgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICAKKyAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAvLyBUYXJnZXRHYWluCisgICAgcmV0dXJuIFRhcmdldEdhaW47Cit9CisjZWxzZQogTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKQogewogICAgIExWTV9JTlQzMiAgICAgICBUYXJnZXRHYWluOwpAQCAtNDAsMyArNDksNCBAQAogCiAgICAgcmV0dXJuIFRhcmdldEdhaW47CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jCmluZGV4IDQ0OWU3YjEuLjczN2UyNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYwpAQCAtNDQsNyArNDQsMTkgQEAKIC8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgVGFyZ2V0R2FpbiwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgQ3VycmVudEdhaW4pCit7CisgICAgTFZNX0ZMT0FUIE1heEdhaW4gPSBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIGlmKEN1cnJlbnRHYWluID4gTWF4R2FpbikKKyAgICAgICAgTWF4R2FpbiA9IEN1cnJlbnRHYWluOworICAgIHBJbnN0YW5jZS0+VGFyZ2V0ID0gVGFyZ2V0R2FpbjsgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIFRhcmdldAorICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnRHYWluOyAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKK30KKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKQpAQCAtNjQsNCArNzYsNCBAQAogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50R2Fpbjw8KDE2LVNoaWZ0KTsgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50CiAgICAgcEluc3RhbmNlLT5TaGlmdD1TaGlmdDsgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAppbmRleCAyOTRlMDVjLi5kMGQwZTFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKQEAgLTI2LDYgKzI2LDE1IEBACiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCiAvKiBJbnN0YW5jZSBwYXJhbWV0ZXIgc3RydWN0dXJlICovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OyAgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBUYXJnZXQgR2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudDsgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBDdXJyZW50IEdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgIERlbHRhOyAgICAgICAgICAgIC8qbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgb2YgRGVsdGEgR2FpbiAqLworfSBNaXhfUHJpdmF0ZV9GTE9BVF9zdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIC8qIEdlbmVyYWwgKi8KQEAgLTM0LDggKzQzLDcgQEAKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFNoaWZ0OyAgICAgICAgICAgICAgICAgIC8qIExlZnQgU2hpZnQgZm9yIEludGVnZXIgcGFydCBvZiBHYWluICovCiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBEZWx0YTsgICAgICAgICAgICAgICAgICAvKiAzMiBiaXQgbnVtYmVyIHNwZWNpZnlpbmcgdGhlIGZyYWN0aW9uYWwgdmFsdWUgb2YgRGVsdGEgR2FpbiAqLwogfSBNaXhfUHJpdmF0ZV9zdDsKLQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIERFRklOSVRJT05TCkBAIC00OSwyMyArNTcsNDMgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwSW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGb3IgYXBwbHlpbmcgZGlmZmVyZW50IGdhaW5zIHRvIExlZnQgYW5kIHJpZ2h0IGNoZW5uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTczLDEyICsxMDEsMTkgQEAKIC8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODYsMTYgKzEyMSwyMiBAQAogLyogcHRySW5zdGFuY2UyIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwgICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pOyAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwotCi0KKyNlbmRpZgogCiAvKioqIDMyIGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKQEAgLTExMiw3ICsxNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNlbmRpZiAvLyNpZm5kZWYgX19MVkNfTUlYRVJfUFJJVkFURV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYwppbmRleCA1ZWZhNTAxLi41NzcxNzlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCkBAIC00Myw3ICs0MywxNCBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldChMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICBUYXJnZXRHYWluKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIHBJbnN0YW5jZS0+VGFyZ2V0ID0gVGFyZ2V0R2FpbjsgICAgICAgICAgICAgICAvLyBVcGRhdGUgZ2FpbiBUYXJnZXQKK30KKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4pCiB7CkBAIC02NCwzICs3MSw0IEBACiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAgICAgICAgICAgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKICAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggNGMxYzhiMi4uNDhmNWQ1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNDQsNyArNDQsNTEgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQoreworI2lmZGVmIEhJR0hFUl9GUworICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTFdID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjdmLC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLworI2Vsc2UKKyAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmfTsvKjQ4MDAwKi8KKyNlbmRpZgogCisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgTFZNX0ZMT0FUIERlbHRhID0gRGVsdGFUYWJsZVtGc107CisgICAgRGVsdGEgPSBEZWx0YSAvIChOdW1DaGFubmVscyk7CisKKyAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgICAgICBEZWx0YSA9IDEuMDAwMDAwZjsKKyAgICBlbHNlCisgICAgICAgIERlbHRhID0gRGVsdGEgLyBUY19taWxsaXNlYzsKKworICAgIGlmKERlbHRhID09IDApCisgICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KKyAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCkBAIC03MywzICsxMTcsNCBAQAogCiAgICAgcEluc3RhbmNlLT5EZWx0YT1EZWx0YTsgICAgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpIGluIFEgMC4zMSBmb3JtYXQKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCmluZGV4IDhkNTMwNGUuLjlkYzdkMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKQEAgLTQ1LDcgKzQ1LDcyIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCit7CisjaWZkZWYgSElHSEVSX0ZTCisgICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTFdID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTY2NjY2ZiwvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZiwvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjZmLC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KKyNlbHNlCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVs5XSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTY2NjY2ZiwvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZn07Lyo0ODAwMCovCisjZW5kaWYKKyAgICBMVk1fRkxPQVQgVGNfbWlsbGlzZWNfZmxvYXQ7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgTFZNX0ZMT0FUIERlbHRhID0gRGVsdGFUYWJsZVtGc107CiAKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldDsKKworICAgIERlbHRhPURlbHRhIC8gKE51bUNoYW5uZWxzKTsKKworICAgIC8qICBHZXQgZ2FpbiB2YWx1ZXMgICovCisgICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKworICAgIGlmIChDdXJyZW50ICE9IFRhcmdldCkKKyAgICB7CisgICAgICAgIFRjX21pbGxpc2VjX2Zsb2F0ID0gKExWTV9GTE9BVCkoVGNfbWlsbGlzZWMpIC8gKEN1cnJlbnQgLSBUYXJnZXQpOworICAgICAgICBpZiAoVGNfbWlsbGlzZWNfZmxvYXQgPCAwKQorICAgICAgICAgICAgVGNfbWlsbGlzZWNfZmxvYXQgPSAtVGNfbWlsbGlzZWNfZmxvYXQ7CisKKyAgICAgICAgaWYoVGNfbWlsbGlzZWMgPT0gMCkKKyAgICAgICAgICAgIERlbHRhID0gMS4wMDAwMDBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBEZWx0YSA9IERlbHRhIC8gVGNfbWlsbGlzZWNfZmxvYXQ7CisKKyAgICAgICAgaWYoRGVsdGEgPT0gMCkKKyAgICAgICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgLyogSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAgLyogTWluaW11bSB2YWx1ZSBmb3IgcHJvcGVyIGNhbGwtYmFja3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0dGluZyBpdCB0byB6ZXJvIGhhcyBzb21lIHByb2JsZW1zLCB0byBiZSBjb3JyZWN0ZWQpICovCisgICAgfQorCisgICAgcEluc3RhbmNlLT5EZWx0YSA9IERlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykKK30KKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKQEAgLTkzLDMgKzE1OCw0IEBACiAKICAgICBwSW5zdGFuY2UtPkRlbHRhPURlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgaW4gUSAwLjMxIGZvcm1hdAogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKaW5kZXggNmQ4ZmU0Ni4uOTA5NDYyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYwpAQCAtNTMsNyArNTMsNyBAQAogLyogICBBOSAgICAgICAgICAgICAxOTQ2Njk1NzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgQTEwICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIIUuLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY4LDcgKzY4LDM2IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fRk9fSFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCit7CisgICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOwogCisgICAgcENvZWZmcy0+QjEgPSAtWTsgICAgICAgICAvKiBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxISovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQTA9KDEtQjEpLzI9IEIxLzIgLSAwLjUqLworICAgIFkgPSBZIC8gMi4wZjsgICAgICAgICAgICAgICAgIC8qIEEwPVk9QjEvMiovCisgICAgWSA9IFkgLSAwLjVmOyAgICAgICAgIC8qIEEwPVk9KEIxLzIgLSAwLjUpKi8KKworICAgIHBDb2VmZnMtPkEwID0gWSAqIEZJTFRFUl9MT1NTX0ZMT0FUOyAgICAgICAgICAgICAgICAgIC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLworICAgIHBDb2VmZnMtPkExID0gLXBDb2VmZnMtPkEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIEExPS1BMCovCisKKyAgICByZXR1cm4gMTsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX0ZPX0hQRiggICBMVk1fSU5UMzIgICAgICAgdywKICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAqcENvZWZmcykKIHsKQEAgLTk3LDQgKzEyNiw0IEBACiAKICAgICByZXR1cm4gMTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMKaW5kZXggODZlYzk1MS4uOWZlNjdmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYwpAQCAtNTMsNyArNTMsNyBAQAogLyogICBBOSAgICAgICAgICAgICAxOTQ2Njk1NzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgQTEwICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIIUuLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY4LDcgKzY4LDMzIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fRk9fTFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCit7CisgICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKKyAgICBwQ29lZmZzLT5CMSA9IC1ZOyAgICAgLy8gU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEwPSgxK0IxKS8yPSBCMS8yICsgMC41CisgICAgWSA9IFkgLyAyLjBmOyAgICAgICAgICAgICAvLyBBMD1ZPUIxLzIKKyAgICBZID0gWSArIDAuNWY7ICAgICAvLyBBMD1ZPShCMS8yICsgMC41KQogCisgICAgcENvZWZmcy0+QTAgPSBZICogRklMVEVSX0xPU1NfRkxPQVQ7CisgICAgcENvZWZmcy0+QTEgPSBwQ29lZmZzLT5BMDsKKworICAgIHJldHVybiAxOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fRk9fTFBGKCAgIExWTV9JTlQzMiAgICAgICB3LAogICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKQogewpAQCAtOTQsNCArMTIwLDQgQEAKICAgICBwQ29lZmZzLT5BMT1wQ29lZmZzLT5BMDsKICAgICByZXR1cm4gMTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCmluZGV4IGYzYjliM2MuLjc4NDZjYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCkBAIC0zMiwxNiArMzIsNDUgQEAKICNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDEgICAgMTIgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgOGtIeiwgMTEuMDI1a0h6IGFuZCAxMmtIeiBpLmUuIDEyPTQxLTI5ICovCiAjZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQyICAgIDEzICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDE2a0h6LCAyMi4wNTBrSHogYW5kIDI0a0h6IGkuZS4gMTM9NDItMjkgKi8KICNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDMgICAgMTQgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMzJrSHosIDQ0LjFrSHogYW5kIDQ4a0h6IGkuZS4gMTQ9NDMtMjkgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMCAsIC8qIDhrSHogaW4gUTQxLCAxNmtIeiBpbiBRNDIsIDMya0h6IGluIFE0MyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMTAyNSwgIC8qIDExMDI1IEh6IGluIFE0MSwgMjIwNTBIeiBpbiBRNDIsIDQ0MTAwIEh6IGluIFE0MyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzEyMDAwfTsgLyogMTJrSHogaW4gUTQxLCAyNGtIeiBpbiBRNDIsIDQ4a0h6IGluIFE0MyAqLwotCisjZW5kaWYKIAogY29uc3QgTFZNX0lOVDMyICAgICBMVlZETF8yUGlPbkZzU2hpZnRUYWJsZVtdPXtMVlZETF8yUGlCeUZzX1NISUZUMSAsICAgICAgICAgLyogOGtIeiwgMTEwMjVIeiwgMTJrSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlGc19TSElGVDIsICAgICAgICAgIC8qIDE2a0h6LCAyMjA1MEh6LCAyNGtIeiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5RnNfU0hJRlQzfTsgICAgICAgICAvKiAzMmtIeiwgNDQxMDBIeiwgNDhrSHogKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVlZETF8yUGlCeV84MDAwX2YgICAgICAgIDAuMDAwNzg1Mzk4ZgorI2RlZmluZSBMVlZETF8yUGlCeV8xMTAyNV9mICAgICAgIDAuMDAwNTY5OTAzZgorI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMF9mICAgICAgIDAuMDAwNTIzNTk5ZgorI2RlZmluZSBMVlZETF8yUGlCeV8xNjAwMF9mICAgICAgIDAuMDAwMzkyNzAwZgorI2RlZmluZSBMVlZETF8yUGlCeV8yMjA1MF9mICAgICAgIDAuMDAwMjg0OTUyZgorI2RlZmluZSBMVlZETF8yUGlCeV8yNDAwMF9mICAgICAgIDAuMDAwMjYxODAwZgorI2RlZmluZSBMVlZETF8yUGlCeV8zMjAwMF9mICAgICAgIDAuMDAwMTk2MzUwZgorI2RlZmluZSBMVlZETF8yUGlCeV80NDEwMF9mICAgICAgIDAuMDAwMTQyNDc2ZgorI2RlZmluZSBMVlZETF8yUGlCeV80ODAwMF9mICAgICAgIDAuMDAwMTMwOTAwZgogCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWVkRMXzJQaUJ5Xzk2MDAwX2YgICAgICAgMC4wMDAwNjU0NTBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzE5MjAwMF9mICAgICAgMC4wMDAwMzI3MjVmCisjZW5kaWYKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzExMDI1X2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTYwMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzIyMDUwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8yNDAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMzIwMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ0MTAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV80ODAwMF9mCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV85NjAwMF9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xOTIwMDBfZgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIExWTV9HZXRPbWVnYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTksNyArODgsMjAgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHc9MipwaSpGYy9GcyBpbiBRMi4yOSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgSElHSEVSX0ZTCitMVk1fRkxPQVQgTFZNX0dldE9tZWdhKExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBGYywKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKQorI2Vsc2UKK0xWTV9GTE9BVCBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZjLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCisjZW5kaWYKK3sKKyAgICBMVk1fRkxPQVQgICB3OworICAgIHcgPSAoTFZNX0ZMT0FUKUZjICogTFZWRExfMlBpT25Gc1RhYmxlW0ZzXTsKKyAgICByZXR1cm4gdzsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX0dldE9tZWdhKExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBGYywKICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKQogewpAQCAtNjcsNCArMTA5LDQgQEAKICAgICBNVUwzMngzMklOVE8zMigoTFZNX0lOVDMyKUZjLExWVkRMXzJQaU9uRnNUYWJsZVtGcyUzXSx3LExWVkRMXzJQaU9uRnNTaGlmdFRhYmxlW0ZzLzNdKQogICAgIHJldHVybiB3OwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaAppbmRleCA2ODQ2ZDQ5Li5mMWU0NWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCkBAIC04Nyw1ICs4Nyw1OCBAQAogI2RlZmluZSBBTFBIQV80OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KICNkZWZpbmUgQUxQSEFfNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVCAvKiBCVUlMRF9GTE9BVCAqLworI2RlZmluZSBBTFBIQV9GbG9hdF8wICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzEgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNSAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTkyZgorI2RlZmluZSBBTFBIQV9GbG9hdF82ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5ODlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzcgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk4NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfOCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTc5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF85ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5NzBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzEwICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk1N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTEgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5MTRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzEzICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTg3OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTQgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5ODI5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNSAgICAgICAgICAgICAgICAgICAgICAgMC45OTk3NThmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE2ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTY1OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTcgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5NTE2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xOCAgICAgICAgICAgICAgICAgICAgICAgMC45OTkzMTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE5ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTAzM2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk4NjMzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMSAgICAgICAgICAgICAgICAgICAgICAgMC45OTgwNjdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NzI2OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjMgICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNCAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ1NDVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI1ICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjI5NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjYgICAgICAgICAgICAgICAgICAgICAgIDAuOTg5MTIzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNyAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NTRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI4ICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODM3MGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjkgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5NTUzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMCAgICAgICAgICAgICAgICAgICAgICAgMC45NTcyMjFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMxICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDA1MWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzIgICAgICAgICAgICAgICAgICAgICAgIDAuOTE2Mjk3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMyAgICAgICAgICAgICAgICAgICAgICAgMC44ODM3MjlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM0ICAgICAgICAgICAgICAgICAgICAgICAwLjgzOTY0NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzUgICAgICAgICAgICAgICAgICAgICAgIDAuNzgxMDM2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNiAgICAgICAgICAgICAgICAgICAgICAgMC43MDUwNzhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM3ICAgICAgICAgICAgICAgICAgICAgICAwLjYxMDEwOGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzggICAgICAgICAgICAgICAgICAgICAgIDAuNDk3MjM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zOSAgICAgICAgICAgICAgICAgICAgICAgMC4zNzIzNDNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQwICAgICAgICAgICAgICAgICAgICAgICAwLjI0NzM1MWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDEgICAgICAgICAgICAgICAgICAgICAgIDAuMTM4NzIyZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MiAgICAgICAgICAgICAgICAgICAgICAgMC4wNjEyMzRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQzICAgICAgICAgICAgICAgICAgICAgICAwLjAxOTI2N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDQgICAgICAgICAgICAgICAgICAgICAgIDAuMDAzNzU2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzNzJmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ2ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDcgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBBTFBIQV9GbG9hdF80OCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ5ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCmluZGV4IDgwOWQ5MDQuLjE4YjI3ODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMKQEAgLTU3LDcgKzU3LDExMCBAQAogLyogIEFscGhhICAgLSB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IFEzMSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyICAgdGMsCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgIEZzLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpCit7CiAKKyAgICBMVk1fVUlOVDMyICBQcm9kdWN0OworICAgIExWTV9GTE9BVCAgUHJvZHVjdEZsb2F0OworICAgIExWTV9JTlQxNiAgIEludGVycG9sYXRlU2hvcnQ7CisgICAgTFZNX0ZMT0FUICAgSW50ZXJwb2xhdGU7CisgICAgTFZNX1VJTlQxNiAgU2hpZnQ7CisgICAgTFZNX0ZMT0FUICAgRGlmZjsKKyAgICBMVk1fRkxPQVQgIFRhYmxlW10gPSB7QUxQSEFfRmxvYXRfMCwgICAgICAgICAgICAgLyogTG9nIHNwYWNlZCBsb29rLXVwIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF81MH07CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHByb2R1Y3Qgb2YgdGhlIHRpbWUgY29uc3RhbnQgYW5kIHRoZSBzYW1wbGUgcmF0ZSAqLworICAgIFByb2R1Y3QgPSAoKHRjID4+IDE2KSAqIChMVk1fVUlOVDMyKUZzKSA8PCAxMzsgIC8qIFN0ZXJlbyB2YWx1ZSAqLworICAgIFByb2R1Y3QgPSBQcm9kdWN0ICsgKCgodGMgJiAweDAwMDBGRkZGKSAqIChMVk1fVUlOVDMyKUZzKSA+PiAzKTsKKworICAgIGlmIChOdW1DaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgUHJvZHVjdCA9IFByb2R1Y3QgPj4gMTsgICAvKiBNb25vIHZhbHVlICovCisgICAgfQorCisgICAgLyogTm9ybWFsaXplIHRvIGdldCB0aGUgdGFibGUgaW5kZXggYW5kIGludGVycG9sYXRpb24gZmFjdG9yICovCisgICAgZm9yIChTaGlmdCA9IDA7IFNoaWZ0IDwgKChBbHBoYV9UYWJsZVNpemUgLSAxKSAvIDIpOyBTaGlmdCsrKQorICAgIHsKKyAgICAgICAgaWYgKChQcm9kdWN0ICYgMHg4MDAwMDAwMCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0ID0gUHJvZHVjdCA8PCAxOworICAgIH0KKyAgICBTaGlmdCA9IChMVk1fVUlOVDE2KSgoU2hpZnQgPDwgMSkpOworCisgICAgaWYgKChQcm9kdWN0ICYgMHg0MDAwMDAwMCk9PTApCisgICAgeworICAgICAgICBTaGlmdCsrOworICAgIH0KKworICAgIEludGVycG9sYXRlU2hvcnQgPSAoTFZNX0lOVDE2KSgoUHJvZHVjdCA+PiAxNSkgJiAweDAwMDA3RkZGKTsKKyAgICBJbnRlcnBvbGF0ZSA9IChMVk1fRkxPQVQpSW50ZXJwb2xhdGVTaG9ydCAvIDMyNzY4LjBmOworCisgICAgRGlmZiA9IChUYWJsZVtTaGlmdF0gLSBUYWJsZVtTaGlmdCArIDFdKTsKKyAgICBEaWZmID0gRGlmZiAqIEludGVycG9sYXRlOworICAgIFByb2R1Y3RGbG9hdCA9IFRhYmxlW1NoaWZ0ICsgMV0gKyBEaWZmOworCisgICAgcmV0dXJuIFByb2R1Y3RGbG9hdDsKK30KKyNlbHNlCiBMVk1fVUlOVDMyIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpCkBAIC0xNTQsMyArMjU3LDQgQEAKIAogICAgIHJldHVybiBQcm9kdWN0OwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYwppbmRleCBhNmQ3ZGIyLi5jZDU3NzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKQEAgLTI1LDcgKzI1LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHBvbHlub21pYWwgZXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsg77+9Li4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpwQ29lZmZpY2llbnRzLCAgICAgICAgICAgICAgICAgICovCkBAIC00MCw3ICs0MCw0OCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgVGhlIHJlc3VsdCBvZiB0aGUgcG9seW5vbWlhbCBleHBhbnNpb24gaW4gUTEuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiAgICBOLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAqcENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgWCkKK3sKKyAgICBMVk1fSU5UMzIgaTsKKyAgICBMVk1fRkxPQVQgWSxBLFhUZW1wLFRlbXAsc2lnbjsKIAorICAgIFkgPSAqcENvZWZmaWNpZW50czsgLyogWT1BMCovCisgICAgcENvZWZmaWNpZW50cysrOworCisgICAgaWYoWCA9PSAtMS4wZikKKyAgICB7CisgICAgICAgIFRlbXAgPSAtMTsKKyAgICAgICAgc2lnbiA9IFRlbXA7CisgICAgICAgIGZvcihpID0gMTsgaSA8PSBOOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFkgKz0gKCgqcENvZWZmaWNpZW50cykgKiBzaWduKTsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKyAgICAgICAgICAgIHNpZ24gKj0gVGVtcDsKKyAgICAgICAgfQorCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgWFRlbXAgPSBYOworICAgICAgICBmb3IoaSA9IE4tMTsgaSA+PSAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIEEgPSAqcENvZWZmaWNpZW50czsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKworICAgICAgICAgICAgVGVtcCA9IEEgKiBYVGVtcDsKKyAgICAgICAgICAgIFkgKz0gVGVtcDsKKworICAgICAgICAgICAgVGVtcCA9IFhUZW1wICogWDsKKyAgICAgICAgICAgIFhUZW1wID0gVGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gWTsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiAgICBOLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAqcENvZWZmaWNpZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgWCkKQEAgLTkzLDQgKzEzNCw0IEBACiAgICAgfQogICAgIHJldHVybiBZOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jCmluZGV4IDZjYTEwNzcuLjg3ODU1OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYwpAQCAtNDQsNyArNDQsNyBAQAogLyogICBBMTEgICAgICAgICAgICA1MDQ3NzI0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgQTEyICAgICAgICAgICAgLTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIIUuLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU0LDcgKzU0LDI4IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGUgcmVzdWx0IG9mIHRoZSAxMHggZXhwYW5zaW9uIGluIFE4LjI0IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9Qb3dlcjEwKExWTV9GTE9BVCAgICAgWCkKK3sKKyAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdPXswLjk5OTkwNmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMDI0NzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjUyNzY1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjAzNTQ5NGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNjU2NjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTM3Njc2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIxMzE5MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNjk2MDNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDE2NTUzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDM3M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE4MTdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzY3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKChMVk1fVUlOVDE2KTExLAorICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgWCk7CisgICAgcmV0dXJuIFk7Cit9CisjZWxzZQogTFZNX0lOVDMyIExWTV9Qb3dlcjEwKExWTV9JTlQzMiAgICAgWCkKIHsKICAgICBMVk1fSU5UMzIgWSxDb2VmZmljaWVudHNbMTNdPXsgIDE2Nzc1NjM2LApAQCAtNzUsNCArOTYsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgWCk7CiAgICAgcmV0dXJuIFk7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYwppbmRleCAyZjFlNTkxLi45ZTE0YzNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYwpAQCAtMjQsNyArMjQsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMb2FkQ29uc3RfMzIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExvYWRDb25zdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOwogCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gdmFsOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZWxzZQogdm9pZCBMb2FkQ29uc3RfMzIoY29uc3QgTFZNX0lOVDMyICAgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKQpAQCAtMzksNSArNTQsNiBAQAogCiAgICAgcmV0dXJuOwogfQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jCmluZGV4IDI2Mjk3ZTcuLjAyYzkwNmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMKQEAgLTc3LDQgKzc3LDU4IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTVNUbzJpX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY1MsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIHRlbXAsbVZhbCxzVmFsOworICAgIExWTV9JTlQxNiBpaTsKKworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBtVmFsID0gKExWTV9GTE9BVCkqc3JjTTsKKyAgICAgICAgc3JjTSsrOworCisgICAgICAgIHNWYWwgPSAoTFZNX0ZMT0FUKSpzcmNTOworICAgICAgICBzcmNTKys7CisKKyAgICAgICAgdGVtcCA9IG1WYWwgKyBzVmFsOworCisgICAgICAgIGlmICh0ZW1wID4gMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0xLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLTEuMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworCisgICAgICAgIHRlbXAgPSBtVmFsIC0gc1ZhbDsKKworICAgICAgICBpZiAodGVtcCA+IDEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjBmOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0gMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKaW5kZXggZjI4ZjM2Ni4uZTNmYjQwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKQEAgLTY0LDcgKzY0LDQ0IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTWFjM3NfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCBzcmN2YWw7CisgICAgTFZNX0ZMT0FUIFRlbXAsZEluVmFsOwogCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBzcmN2YWwgPSAqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICBUZW1wID0gc3JjdmFsICogdmFsOworCisgICAgICAgIGRJblZhbCAgPSAoTFZNX0ZMT0FUKSpkc3Q7CisgICAgICAgIFRlbXAgPSBUZW1wICsgZEluVmFsOworCisgICAgICAgIGlmIChUZW1wID4gMS4wMDAwMDBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMS4wMDAwMDBmOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wMDAwMDBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLTEuMDAwMDAwZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKaW5kZXggNzNjMjZlZC4uMTZlMzY3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCkBAIC0zMiw3ICszMiw3MSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWElOU09GVF9EMzJDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgbikKK3sKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIEluIGNhc2UgdGhlIGNvcmUgZnVuY3Rpb24gd291bGQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENhbGwgYmFjayBiZWZvcmUgdGhlIGhhcmQgbWl4aW5nLCBiZWNhdXNlIGluIHRoaXMgY2FzZSwgaGFyZCBtaXhpbmcgbWFrZXMKKyAgICAgICB1c2Ugb2YgdGhlIGNvcmUgc29mdCBtaXggZnVuY3Rpb24gd2hpY2ggY2FuIGNoYW5nZSB0aGUgQ3VycmVudCB2YWx1ZSEgICAgICAqLworCisgICAgaWYgKHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQpeworICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIE1peF8xU3RfQ2xsX3QgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgKmRzdCwKQEAgLTkxLDUgKzE1NSw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKaW5kZXggY2E4OGIwNC4uODY5MjkzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwpAQCAtMzQsNyArMzQsNjggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlLT5BbHBoYSA9PSAwKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICB9ZWxzZSBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQShwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIGRzdCwgbik7CisgICAgICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZil7CisgICAgICAgICAgICBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXNyYywgKExWTV9GTE9BVCopZHN0LCAoTFZNX0lOVDE2KShuKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgcEluc3RhbmNlLT5DdXJyZW50LCBkc3QsIG4pOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQpeworICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKQEAgLTkxLDUgKzE1Miw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKaW5kZXggMmUwYTA5OS4uNmZjMWI5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYwpAQCAtMjYsNyArMjYsNDQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhTT0ZUXzJTVF9EMzJDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQorewogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50MSAhPSBwSW5zdGFuY2UtPlRhcmdldDEpIHx8IChwSW5zdGFuY2UtPkN1cnJlbnQyICE9IHBJbnN0YW5jZS0+VGFyZ2V0MikpCisgICAgeworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKChNaXhfMVN0X0NsbF9GTE9BVF90KilwSW5zdGFuY2UsIHNyYzEsIGRzdCwgbik7CisgICAgICAgIE1peEluU29mdF9EMzJDMzFfU0FUKCh2b2lkICopJnBJbnN0YW5jZS0+QWxwaGEyLCAvKiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50MSA9PSAwKQorICAgICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgodm9pZCAqKSAmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogbm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSBpZiAocEluc3RhbmNlLT5DdXJyZW50MiA9PSAwKQorICAgICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopIHBJbnN0YW5jZSwgc3JjMSwgZHN0LCBuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKHBJbnN0YW5jZSwgc3JjMSwgc3JjMiwgZHN0LCBuKTsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCkBAIC02MSw1ICs5OCw2IEBACiAgICAgICAgICAgICBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoIHBJbnN0YW5jZSwgc3JjMSwgc3JjMiwgZHN0LCBuKTsKICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaAppbmRleCA2MDcwNzNjLi4wMGQ1NWVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCkBAIC0yNiw2ICsyNiwxMCBAQAogCiAjZGVmaW5lIFBPSU5UX1pFUk9fT05FX0RCIDI0NzM4MDUgLyogMC4wMSBkQiBvbiBhIGZ1bGwgc2NhbGUgc2lnbmFsID0gKDEwXigwLjAxLzIwKSAtMSkgKiAyXjMxICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCAwLjAwMTE1MiAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCA9ICgxMF4oMC4wMS8yMCkgLTEpICogMl4zMSAqLworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKaW5kZXggYzA5ZWMwZi4uNzk2YTE1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jCkBAIC00NSw1ICs0NSwyNiBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1vbm9UbzJJX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgc3JjICs9IChuIC0gMSk7CisgICAgZHN0ICs9ICgobiAqIDIpIC0gMSk7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICBkc3QtLTsKKworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyYy0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jCmluZGV4IGE1ZGM1MGYuLmM3NTg1NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jCkBAIC00Nyw1ICs0NywyMyBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE11bHQzc19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKKyAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIHRlbXA7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHRlbXAgPSAoKnNyYykgKiB2YWw7CisgICAgICAgIHNyYysrOworICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYwppbmRleCA3MzM0M2NkLi41MTU2ZWRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMKQEAgLTExNCw0ICsxMTQsNTQgQEAKICAgICB9CiAKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBOb25MaW5Db21wX0Zsb2F0KExWTV9GTE9BVCAgICAgICAgR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpCit7CiAKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICBTYW1wbGU7ICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBzYW1wbGVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgU2FtcGxlTm87ICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgIFRlbXA7CisKKworICAgIC8qCisgICAgICogUHJvY2VzcyBhIGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgKi8KKyAgICBmb3IoU2FtcGxlTm8gPSAwOyBTYW1wbGVObyA8IEJsb2NrTGVuZ3RoOyBTYW1wbGVObysrKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVhZCB0aGUgaW5wdXQKKyAgICAgICAgICovCisgICAgICAgIFNhbXBsZSA9ICpwRGF0YUluOworICAgICAgICBwRGF0YUluKys7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgY29tcGFuZGVyLCB0aGlzIGNvbXByZXNzZXMgdGhlIHNpZ25hbCBhdCB0aGUgZXhwZW5zZSBvZgorICAgICAgICAgKiBoYXJtb25pYyBkaXN0b3J0aW9uLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIGNvbnRyb2wgYnkgdGhlCisgICAgICAgICAqIGdhaW4gZmFjdG9yCisgICAgICAgICAqLworICAgICAgICBpZiAoU2FtcGxlICE9IC0xLjBmKQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wID0gKChTYW1wbGUgKiBTYW1wbGUpKTsKKyAgICAgICAgICAgIGlmKFNhbXBsZSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgKyBUZW1wKSkgKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNhdmUgdGhlIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgKnBEYXRhT3V0ID0gU2FtcGxlOworICAgICAgICBwRGF0YU91dCsrOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKaW5kZXggYzhjMTUyNy4uOWMxN2EwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCkBAIC0zOCw2ICszOCw4OCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTCx5blIseW5MTyx5blJPLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD0gKEEwICAqICh4KG4pTCAtIHgobi0yKUwgICkgKSovCisgICAgICAgICAgICB0ZW1wbCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgICAgICB5bkwgPSB0ZW1wbCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkpICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIxICogeShuLTEpTCAgKSApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTE89ICgoR2FpbiAqIHluTCApKSAqLworICAgICAgICAgICAgeW5MTyA9IHluTCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluTE89KCB5bkxPICsgeChuKUwgICkqLworICAgICAgICAgICAgeW5MTyArPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9IChBMCAgKiAoeChuKVIgIC0geChuLTIpUiAgKSApICovCisgICAgICAgICAgICB0ZW1wbCA9ICgqKHBEYXRhSW4gKyAxKSkgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgICAgICB5blIgPSB0ZW1wbCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgIC8qIHluUis9ICgoLUIyICAqIHkobi0yKVIgICkgKSAgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjEgICogeShuLTEpUiAgKSApICAgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5STz0gKChHYWluICAqIHluUiApKSAqLworICAgICAgICAgICAgeW5STyA9IHluUiAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluUk89KCB5blJPICsgeChuKVIgICkqLworICAgICAgICAgICAgeW5STyArPSAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5MTzsgLyogV3JpdGUgTGVmdCBvdXRwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IHluUk87IC8qIFdyaXRlIFJpZ2h0IG91cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExOCw0ICsyMDAsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMKaW5kZXggNjdhNTcwYi4uZjcwNWNiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCkBAIC0zOCw2ICszOCw3IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTYsNCArMTE3LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCAxZDYxNDJjLi42NTQ3NWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgIFBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC0zNSw0ICszNSw0IEBACiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109cENvZWYtPkc7CiAKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggYjlmNjRlNi4uYTM2MzMwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMTcsNyArMTcsMjMgQEAKIAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOwogCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHBDb2VmLT5BMDsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHBDb2VmLT5HOworfQorI2Vsc2UKIHZvaWQgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC0zNCw0ICs1MCw0IEBACiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109cENvZWYtPkc7CiAKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggZTIwNTBlMC4uMWUzMjA2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjEsNiArMjEsMTYgQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLworCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRmxvYXRfCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRmxvYXQ7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0ICogUEZpbHRlcl9TdGF0ZV9GbG9hdCA7CisjZW5kaWYKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CiAgIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKaW5kZXggODM2MzI3MC4uMjhmZWE2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jCkBAIC0yNCw3ICsyNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YxNnh2MTYKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIFNoaWZ0X1NhdF92MTZ4djE2IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICpkc3QsCkBAIC03Nyw1ICs3Nyw1IEBACiAgICAgfQogICAgIHJldHVybjsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCmluZGV4IGZiZDEzMmUuLmZhYzlkZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYwpAQCAtMjQsNyArMjQsNjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBTaGlmdF9TYXRfdjMyeHYzMgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgU2hpZnRfU2F0X0Zsb2F0IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQoreworICAgIExWTV9GTE9BVCAgIHRlbXA7CisgICAgTFZNX0lOVDMyICAgaWksaWo7CisgICAgTFZNX0lOVDE2ICAgUlNoaWZ0OwogCisgICAgaWYodmFsID4gMCkKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKExWTV9GTE9BVCkqc3JjOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICBmb3IoaWogPSAwOyBpaiA8IHZhbDsgaWorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCAqIDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHRlbXAgPiAxLjApCisgICAgICAgICAgICAgICAgdGVtcCA9IDEuMDsKKyAgICAgICAgICAgIGlmKHRlbXAgPCAtMS4wKQorICAgICAgICAgICAgICAgIHRlbXAgPSAtMS4wOworCisgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZih2YWwgPCAwKQorICAgIHsKKyAgICAgICAgUlNoaWZ0PShMVk1fSU5UMTYpKC12YWwpOworCisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKExWTV9GTE9BVCkqc3JjOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICBmb3IoaWogPSAwOyBpaiA8IFJTaGlmdDsgaWorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoc3JjICE9IGRzdCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorI2Vsc2UKIHZvaWQgU2hpZnRfU2F0X3YzMnh2MzIgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMzIgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgKmRzdCwKQEAgLTc5LDUgKzEzNCw1IEBACiAgICAgfQogICAgIHJldHVybjsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCmluZGV4IGFjMDM0M2YuLjlhNzI2ZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuYwpAQCAtMjksNiArMjksOSBAQAogLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCiAKICNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaWZkZWYgQlVJTERfRkxPQVQKKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjQsNiArNjcsMTggQEAKICNkZWZpbmUgU0VDT05EX0NPRUYgICAgICAzODgzNgogI2RlZmluZSBNQVhfVkFMVUUgICAgICAgIDE1MzYgICAgICAgICAgICAgICAgICAgLyogOTYgKiAxNiAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCAgIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiAgICBkYl9maXgpCit7CisgICAgTFZNX0ZMT0FUICAgIGRCX0Zsb2F0OworICAgIExWTV9GTE9BVCAgICBMaW5GbG9hdDsKKworICAgIGRCX0Zsb2F0ID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVClkYl9maXggLyAxNi4wZik7CisgICAgTGluRmxvYXQgPSBwb3coMTAsIGRCX0Zsb2F0IC8gMjAuMCk7CisKKyAgICByZXR1cm4gTGluRmxvYXQ7Cit9CisjZWxzZQogTFZNX0lOVDMyICAgZEJfdG9fTGluMzIoTFZNX0lOVDE2ICAgIGRiX2ZpeCkKIHsKICAgICBMVk1fSU5UMzIgTGluX3ZhbF8zMjsKQEAgLTEwNiw0ICsxMjEsNCBAQAogCiAgICAgcmV0dXJuIExpbl92YWxfMzI7ICAvKiBmb3JtYXQgMS4xNi4xNSAqLwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCmluZGV4IGRiNmFhYmUuLjhlMGI3MzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApAQCAtMjAwLDYgKzIwMCwxMCBAQAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzMyMDAwICAgICAgICAgICAgICAgIDY0CiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAgMTI4CiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAgMjU2CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAgMTAyNAorI2VuZGlmCiAKIHR5cGVkZWYgZW51bQogewpAQCAtMjEyLDYgKzIxNiwxMCBAQAogICAgIExWRVFOQl9GU18zMjAwMCA9IDYsCiAgICAgTFZFUU5CX0ZTXzQ0MTAwID0gNywKICAgICBMVkVRTkJfRlNfNDgwMDAgPSA4LAorI2lmZGVmIEhJR0hFUl9GUworICAgIExWRVFOQl9GU185NjAwMCA9IDksCisgICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEwLAorI2VuZGlmCiAgICAgTFZFUU5CX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfRnNfZW47CiAKQEAgLTI2OCw2ICsyNzYsNyBAQAogewogICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOworCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCYW5kczsKQEAgLTQ2MCwxMSArNDY5LDE3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2VuZGlmCiAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYwppbmRleCBmZGRlZGI5Li5mZjUyYjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMKQEAgLTIyLDcgKzIyLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03Nyw2ICs3OSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKQpAQCAtMTY4LDcgKzE3MSw3IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIwNSw3ICsyMDgsNjcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAqcENvZWZmaWNpZW50cykKK3sKIAorICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX0dhaW5UYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfRFRhYmxlW107CisKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbiAgICAgICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+R2FpbjsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIEZyZXF1ZW5jeSAgID0gcEZpbHRlckRlZmluaXRpb24tPkZyZXF1ZW5jeTsKKyAgICAvKiBBcyBtZW50aW9uZWQgaW4gZWZmZWN0YnVuZGxlLmggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFFGYWN0b3IgICAgID0gKExWTV9GTE9BVClwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvciAvIDEwMC4wZjsKKworCisgICAgLyoKKyAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICBUMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEQ7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBBMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIxOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjI7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgICovCisgICAgVDAgPSBGcmVxdWVuY3kgKiBMVkVRTkJfVHdvUGlPbkZzVGFibGVbRnNdOyAgICAgICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgaWYgKEdhaW4gPj0gMCkKKyAgICB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlWzE1XTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgICAgICAgICAgICBpZiBHYWluZEIgPj0gMCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVtHYWluICsgMTVdOyAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgLyAoMSArIEcpICBpZiBHYWluZEIgPCAgMCAqLworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMixCMSxBMCBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBCMiA9IC0wLjUgKiAoMiAqIFFGYWN0b3IgLSBEICogVDApIC8gKDIgKiBRRmFjdG9yICsgRCAqIFQwKTsKKyAgICBCMSA9ICgwLjUgLSBCMikgKiBjb3MoVDApOworICAgIEEwID0gKDAuNSArIEIyKSAvIDIuMDsKKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICAvKiBhbGwgdGhlIGNvZWZmaWNpZW50cyBhcmUgbXVsdGlwbGllZCB3aXRoIDIgdG8gbWFrZSB0aGVtIGFsaWduIHdpdGggZml4ZWQgcG9pbnQgdmFsdWVzKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IDIgKiBBMDsKKyAgICBwQ29lZmZpY2llbnRzLT5CMSA9IDIgKiBCMTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IDIgKiBCMjsKKyAgICBwQ29lZmZpY2llbnRzLT5HICA9IExWRVFOQl9HYWluVGFibGVbR2FpbiArIDE1XTsKKworICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cykKQEAgLTI5NiwzICszNTksNCBAQAogICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CiAKIH0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKaW5kZXggOTUyMTJmMi4uZjBkZWI2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKQEAgLTI1LDcgKzI1LDM5IEBACiAvKiBHYWluIHRhYmxlIGZvciAoMTBeKEdhaW4vMjApIC0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODIyMTcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODAwNDc0ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzc2MTI4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzQ4ODExZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzE4MTYyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjgzNzcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc5X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjQ1MTg3ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc4X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjAxODkzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTUzMzE2ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc2X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk4ODEzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDM3NjU5ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzY5MDQzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWczX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjkyMDU0ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjA1NjcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTA4NzQ5ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8wX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTIyMDE4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8yX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU4OTI1ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8zX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDEyNTM4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl80X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl81X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzc4Mjc5ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl82X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MjYyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl83X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgorI2RlZmluZSBMVkVRTkJfR2Fpbl84X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExODg2ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl85X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODE4MzgzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTQ4MTM0ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTgxMDcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjIzNDEzZgorI2Vsc2UKICNkZWZpbmUgTFZFUU5CX0dBSU5TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE2ODQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MjIxNzIgKi8KICNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE2MzkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MDA0NzQgKi8KQEAgLTU4LDE0ICs5MCwzMCBAQAogI2RlZmluZSBMVkVRTkJfR2Fpbl8xM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDMuNDY2ODM2ICovCiAjZGVmaW5lIExWRVFOQl9HYWluXzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MjE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC4wMTE4NzIgKi8KICNkZWZpbmUgTFZFUU5CX0dhaW5fMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk0NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjYyMzQxMyAqLwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGcmVxdWVuY3kgdGFibGUgZm9yIDIqUGkvRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzg1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA1NzBmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDUyNGYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzkzZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAyODVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDI2MmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTk2ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxNDJmCisjZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEzMWYKIAorI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVkVRTkJfMlBpT25fOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNjVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzM2YKKyNlbmRpZgorCisjZWxzZQogI2RlZmluZSBMVkVRTkJfRlJFUVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjM1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwNzg1ICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MTIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDA1NzAgKi8KQEAgLTc2LDE0ICsxMjQsMzEgQEAKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1ODggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDE5NiAqLwogI2RlZmluZSBMVkVRTkJfMlBpT25fNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTQyICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxMzEgKi8KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogNTBEIHRhYmxlIGZvciA1MCAvICggMSArIEdhaW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjIzNDEzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wMTE4NzJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjQ2NjgzNmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgxMDcyZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDgxMzRmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjE2MjI3OGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzgzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc4X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41MTE4ODZmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjIzODcyMWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTk1MjYyZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NzgyNzlmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU4NDg5M2YKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyNTM4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTg5MjVmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyMjAxOGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAwMDAwZgorI2Vsc2UKICNkZWZpbmUgTFZFUU5CXzEwMERTSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc5OTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA1LjYyMzQxMyAqLwogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAzOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDUuMDExODcyICovCkBAIC0xMDEsNiArMTY2LDYgQEAKICNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI1ODkyNSAqLwogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMTIyMDE4ICovCiAjZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKi8KLQorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCmluZGV4IDEwZTdkNzQuLmMyOTBhZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMKQEAgLTE0MCw4ICsxNDAsMTIgQEAKIHZvaWQgICAgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKIHsKLQorI2lmZGVmIEhJR0hFUl9GUworICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDMyICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisjZWxzZQogICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDE2ICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisjZW5kaWYKKwogICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICBmcyA9IChMVk1fVUlOVDMyKUxWRVFOQl9TYW1wbGVSYXRlVGFiWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgLyogU2FtcGxlIHJhdGUgKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLwpAQCAtMTU4LDExICsxNjIsMTUgQEAKICAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7ICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCiAKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OyAvKiBEZWZhdWx0IHRvIHNpbmdsZSBwcmVjaXNpb24gKi8KKyNlbHNlCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIGZpbHRlciBzZXQgdGhlIHR5cGUgb2YgYmlxdWFkIHJlcXVpcmVkCiAgICAgICAgICAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX1NpbmdsZVByZWNpc2lvbjsgICAgICAgICAvKiBEZWZhdWx0IHRvIHNpbmdsZSBwcmVjaXNpb24gKi8KKyNlbmRpZgorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBpZiAoKGZjIDw8IDE1KSA8PSAoTE9XX0ZSRVEgKiBmcykpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qCkBAIC0xNzcsNyArMTg1LDcgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9Eb3VibGVQcmVjaXNpb247CiAgICAgICAgIH0KLQorI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogQ2hlY2sgZm9yIG91dCBvZiByYW5nZSBmcmVxdWVuY2llcwpAQCAtMjMwLDYgKzIzOCwyNSBAQAogICAgICAgICBCaXF1YWRUeXBlID0gcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXTsKICAgICAgICAgc3dpdGNoICAoQmlxdWFkVHlwZSkKICAgICAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBjYXNlICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZWxzZQogICAgICAgICAgICAgY2FzZSAgICBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOwpAQCAtMjY5LDYgKzI5Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjg4LDcgKzMxNiw3IEBACiAvKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSkKIHsKICAgICBMVk1fSU5UMTYgICAgICAgKnBUYXBBZGRyZXNzOwpAQCAtMzA1LDggKzMzMywyNCBAQAogICAgICAgICAgICAgICAgICAgICAgTnVtVGFwcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KICAgICB9CiB9CisjZWxzZQordm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworICAgIExWTV9GTE9BVCAgICAgICAqcFRhcEFkZHJlc3M7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVRhcHM7CiAKKyAgICBwVGFwQWRkcmVzcyA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQ7CisgICAgTnVtVGFwcyAgICAgPSAoTFZNX0lOVDE2KSgocEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKSAvIHNpemVvZihMVk1fRkxPQVQpKTsKIAorICAgIGlmIChOdW1UYXBzICE9IDApCisgICAgeworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcFRhcEFkZHJlc3MsICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgTnVtVGFwcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICB9Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQyMiw5ICs0NjYsMTMgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCiAgICAgICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAxLjBmKTsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLjBmKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2KTsKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDApOwotCisjZW5kaWYKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgICAgICAgICAgfQpAQCAtNDMyLDE1ICs0ODAsMTggQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBTdGF5IG9uIHRoZSBPTiBvcGVyYXRpbmcgbW9kZSB1bnRpbCB0aGUgdHJhbnNpdGlvbiBpcyBkb25lICovCiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9PTjsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMC4wZik7CisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMS4wZik7CisjZWxzZQogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCk7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVk1fTUFYSU5UXzE2KTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKLQogICAgICAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9UUlVFOwogICAgICAgICB9CiAKQEAgLTQ3MCw4ICs1MjEsMTMgQEAKICAgICAgLyoKICAgICAgICogU2VuZCBhbiBBTEdPRkYgZXZlbnQgaWYgdGhlIE9OLT5PRkYgc3dpdGNoIHRyYW5zaXRpb24gaXMgZmluaXNoZWQKICAgICAgICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBpZigoTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMCkgJiYKKyAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSl7CisjZWxzZQogICAgIGlmKChMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAweDAwMDAwMDAwKSAmJgogICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKXsKKyNlbmRpZgogICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX0JZUEFTUzsKICAgICAgICAgaWYgKENhbGxCYWNrICE9IExWTV9OVUxMKXsKICAgICAgICAgICAgIENhbGxCYWNrKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSwgTFZNX05VTEwsIEFMR09SSVRITV9FUU5CX0lEfExWRVFOQl9FVkVOVF9BTEdPRkYpOwpAQCAtNDg1LDkgKzU0MSwzIEBACiAKICAgICByZXR1cm4gMTsKIH0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYwppbmRleCBlMDFjMWM1Li5kZTFiYmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCkBAIC05Nyw2ICs5NywyMSBAQAogICAgICAgICAgKi8KICAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKKyAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBUYXBzICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpKTsKKyAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSkpOworICAgICAgICAvKiBCaXF1YWQgdHlwZXMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOworI2Vsc2UKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KQEAgLTEwNyw2ICsxMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSkpOyAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmlxdWFkVHlwZV9lbikpKTsgICAgLyogQmlxdWFkIHR5cGVzICovCisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0RBVEFfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9EQVRBOwpAQCAtMTE3LDEyICsxMzMsMjIgQEAKICAgICAgICAgICovCiAgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7CisgICAgICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKyNlbHNlCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7IC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfQ09FRl9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0NPRUY7CkBAIC0xMzMsOCArMTU5LDE0IEBACiAgICAgICAgICAqLwogICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisjZWxzZQogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfU0NSQVRDSEJVRkZFUlMqc2l6ZW9mKExWTV9JTlQxNikqcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uQWxpZ25tZW50ICAgICAgICAgPSBMVkVRTkJfU0NSQVRDSF9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgICAgICA9IExWRVFOQl9TQ1JBVENIOwpAQCAtMjQ4LDggKzI4MCwxNSBAQAogICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzKTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworICAgIHBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKyNlbHNlCiAgICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7IC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyNlbmRpZgogCiAKIApAQCAtMjU5LDkgKzI5OCwxNSBAQAogICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzKTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOworICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdCA9IChCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CisjZWxzZQogICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QpKTsKICAgICBwSW5zdGFuY2UtPnBFUU5CX1RhcHMgPSAoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOworI2VuZGlmCiAgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSk7CiAgICAgcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zICA9IChMVkVRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKQEAgLTI3OSw4ICszMjQsMTMgQEAKICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5ID0gKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZWxzZQogICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0lOVDE2ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSU5UMTYpKTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKQEAgLTMwOCwxNSArMzU4LDIyIEBACiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gKHZvaWQqKXBJbnN0YW5jZTsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrOworCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7CiAKKwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAsIDEuMGYpOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAsIExWTV9GU184MDAwLCAyKTsKKyNlbHNlCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCxMVk1fTUFYSU5UXzE2KTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDAsTFZNX0ZTXzgwMDAsMik7CisjZW5kaWYKIAogICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICA9IExWTV9GQUxTRTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCmluZGV4IDlkZjk4MGMuLjU2YjAyZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKQEAgLTYwLDYgKzYwLDkgQEAKIC8qIEZpbHRlciBiaXF1YWQgdHlwZXMgKi8KIHR5cGVkZWYgZW51bQogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdCA9IC0xLAorI2VuZGlmCiAgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbiA9IDAsCiAgICAgTFZFUU5CX0RvdWJsZVByZWNpc2lvbiA9IDEsCiAgICAgTFZFUU5CX091dE9mUmFuZ2UgICAgICA9IDIsCkBAIC04NCwxMSArODcsMjAgQEAKICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBBbGlnbmVkIG1lbW9yeSBwb2ludGVycyAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICpwRmFzdFRlbXBvcmFyeTsgICAgICAgIC8qIEZhc3QgdGVtcG9yYXJ5IGRhdGEgYmFzZSBhZGRyZXNzICovCisjZWxzZQogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAqcEZhc3RUZW1wb3Jhcnk7ICAgICAgICAvKiBGYXN0IHRlbXBvcmFyeSBkYXRhIGJhc2UgYWRkcmVzcyAqLworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBFUU5CX1RhcHNfRmxvYXQ7ICAgICAgICAvKiBFcXVhbGlzZXIgVGFwcyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0OyAvKiBTdGF0ZSBmb3IgZWFjaCBmaWx0ZXIgYmFuZCAqLworI2Vsc2UKICAgICAvKiBQcm9jZXNzIHZhcmlhYmxlcyAqLwogICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgICAgICAgKnBFUU5CX1RhcHM7ICAgICAgICAvKiBFcXVhbGlzZXIgVGFwcyAqLwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgICAgICAgKnBFUU5CX0ZpbHRlclN0YXRlOyAvKiBTdGF0ZSBmb3IgZWFjaCBmaWx0ZXIgYmFuZCAqLworI2VuZGlmCiAKICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgYW5kIGNhbGwgYmFjayAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgTkJhbmRzOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KQEAgLTk2LDcgKzEwOCwxMiBAQAogICAgIExWRVFOQl9CaXF1YWRUeXBlX2VuICAgICAgICAgICAgKnBCaXF1YWRUeXBlOyAgICAgICAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCiAKICAgICAvKiBCeXBhc3MgdmFyaWFibGUgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgQnlwYXNzTWl4ZXI7CisjZWxzZQogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgdXNlZCBpbiB0cmFuc2l0aW9ucyAqLworI2VuZGlmCisKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgLyogT3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiBmbGFnICovCiAKIH0gTFZFUU5CX0luc3RhbmNlX3Q7CkBAIC0xMTQsNyArMTMxLDExIEBACiB2b2lkICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMoTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSk7CiAKIHZvaWQgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCAqcEluc3RhbmNlKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOworI2Vsc2UKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOwpAQCAtMTIyLDYgKzE0Myw3IEBACiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKTsKKyNlbmRpZgogCiBMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLCBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwppbmRleCA1OGY1OGVkLi42MzI4MTgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCkBAIC01Nyw3ICs1NywxMjEgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBCaXF1YWQ7CisgICAgTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKKworCisgICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgYnVmZmVycyBhcmUgMzItYml0IGFsaWduZWQgKi8KKyAgICBpZiAoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfQUxJR05NRU5URVJST1I7CisgICAgfQorCisgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CisKKyAgICAvKgorICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWRVFOQl9UT09NQU5ZU0FNUExFUyk7CisgICAgfQorCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSBpbnB1dCBkYXRhIGluIHRvIHNjcmF0Y2ggYnVmZmVyCisgICAgICAgICAqLworCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBzZWN0aW9uIGV4ZWN0ZSB0aGUgZmlsdGVyIHVubGVzcyB0aGUgZ2FpbiBpcyAwZEIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIGJhbmQgaXMgbm9uLXplcm8gZEIgZ2FpbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0uR2FpbiAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBiaXF1YWQgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWQgPSAmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXTsKKworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNlbGVjdCBzaW5nbGUgb3IgZG91YmxlIHByZWNpc2lvbiBhcyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKKyAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICkoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBNb2RlIGlzIE9GRiBzbyBjb3B5IHRoZSBkYXRhIGlmIG5lY2Vzc2FyeQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisKK30KKyNlbHNlCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTE5OCwzICszMTIsNCBAQAogICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CiAKIH0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKaW5kZXggOGUyZTBlOC4uNTYzMTgxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKQEAgLTM2LDYgKzM2LDIwIEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCitjb25zdCBMVk1fVUlOVDMyICAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW10gPSB7ODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAorfTsKKyNlbHNlCiBjb25zdCBMVk1fVUlOVDE2ICAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW10gPSB7ODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLApAQCAtNDQsOCArNTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwCit9OworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTYsNiArNzEsMjIgQEAKIC8qCiAgKiBUYWJsZSBmb3IgMiAqIFBpIC8gRnMKICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0ge0xWRVFOQl8yUGlPbl84MDAwLCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8yMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl85NjAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTkyMDAwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0ge0xWRVFOQl8yUGlPbl84MDAwLCAgICAgIC8qIDhrUy9zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzEyMDAwLApAQCAtNjUsMTAgKzk2LDQ0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8zMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDB9OyAgICAvKiA0OGtTL3MgKi8KKyNlbmRpZgogCiAvKgogICogR2FpbiB0YWJsZQogICovCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzlfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzZfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzBfZEIsICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8yX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl81X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzdfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl84X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9HYWluVGFibGVbXSA9IHtMVkVRTkJfR2Fpbl9OZWcxNV9kQiwgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzE0X2RCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTNfZEIsCkBAIC0xMDEsMTAgKzE2NiwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KIAotCisjZW5kaWYKIC8qCiAgKiBEIHRhYmxlIGZvciAxMDAgLyAoR2FpbiArIDEpCiAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgIExWRVFOQl9EVGFibGVbXSA9IHtMVkVRTkJfMTAwRF9OZWcxNV9kQiwgICAgICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzE0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzExX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnOF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnNV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfMF9kQn07ICAgICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLApAQCAtMTIyLDcgKzIwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzFfZEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEXzBfZEJ9OyAgICAgICAgICAgICAgIC8qIDBkQiBnYWluICovCiAKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZpbHRlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaAppbmRleCAyOGUzMzY5Li45YzJlMjk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKQEAgLTEwNyw4ICsxMDcsMTQgQEAKIAogICAgIC8qIFBhcmFtZXRlcnMgZm9yIFJFViAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMZXZlbDsgICAgICAgICAgICAgICAgICAvKiBMZXZlbCwgMCB0byAxMDAgcmVwcmVzZW50aW5nIHBlcmNlbnRhZ2Ugb2YgcmV2ZXJiICovCisjaWZuZGVmIEhJR0hFUl9GUwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMUEY7ICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIsIGluIEh6ICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEhQRjsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIsIGluIEh6ICovCisjZWxzZQorICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBMUEY7ICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIsIGluIEh6ICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEhQRjsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIsIGluIEh6ICovCisjZW5kaWYKKwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBUNjA7ICAgICAgICAgICAgICAgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50LCBpbiBtcyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEZW5zaXR5OyAgICAgICAgICAgICAgICAvKiBFY2hvIGRlbnNpdHksIDAgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gZGVuc2l0eSAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEYW1waW5nOyAgICAgICAgICAgICAgICAvKiBEYW1waW5nICovCkBAIC0yOTcsMTEgKzMwMywxNyBAQAogLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQogTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMKaW5kZXggYWMyZWY5ZC4uZTcxMDg0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYwpAQCAtNDEsNiArNDEsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpCiB7CiAKQEAgLTU5Myw4ICs1OTQsNTg5IEBACiAKICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKIH0KKyNlbHNlIC8qIEJVSUxEX0ZMT0FUKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKQoreworCisgICAgTFZNX01vZGVfZW4gIE9wZXJhdGluZ01vZGU7CisgICAgTFZNX0lOVDMyICAgIE51bWJlck9mRGVsYXlMaW5lczsKIAogCisgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLworICAgIGlmKHBQcml2YXRlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOworICAgIH0KKworICAgIE9wZXJhdGluZ01vZGUgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGU7CisKKyAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDQ7CisgICAgfQorICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAxOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBoaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuSFBGKSAgICAgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKworICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKKyAgICAgICAgTFZNX0ZPX0hQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5IUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAmQ29lZmZzKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCkgLyBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgbG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTFBGKSAgICAgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKworICAgICAgICBDb2VmZnMuQTAgPSAxOworICAgICAgICBDb2VmZnMuQTEgPSAwOworICAgICAgICBDb2VmZnMuQjEgPSAwOworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiA8PSAoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEbyBub3QgYXBwbHkgZmlsdGVyIGlmIHcgPTIqcGkqZmMvZnMgPj0gMi45CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKE9tZWdhIDw9IChMVk1fRkxPQVQpTFZSRVZfMl85X0lOUTI5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5MUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAmQ29lZmZzKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCkgLyBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgcm9vbSBzaXplIHBhcmFtZXRlcgorICAgICAqLworICAgIGlmKCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKQorICAgIHsKKyAgICAgICAgLyogUm9vbSBzaXplIHJhbmdlIGlzIDEwbXMgdG8gMjAwbXMKKyAgICAgICAgICogMCUgICAtLSAxMG1zCisgICAgICAgICAqIDUwJSAgLS0gNjVtcworICAgICAgICAgKiAxMDAlIC0tIDEyMG1zCisgICAgICAgICAqLworICAgICAgICBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zID0gMTAgKyAoKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplKjExKSArIDUpIC8gMTApOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIFQgZGVsYXkgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIHRoZSBhbGwgcGFzcyBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9VSU5UMzIgIFRlbXA7CisgICAgICAgIExWTV9JTlQzMiAgIEFQRGVsYXlTaXplOworICAgICAgICBMVk1fSU5UMzIgICBGcyA9IExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICBMVk1fVUlOVDMyICBEZWxheUxlbmd0aFNhbXBsZXMgPSAoTFZNX1VJTlQzMikoRnMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zKTsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0ZMT0FUICAgU2NhbGVUYWJsZVtdICA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKKyAgICAgICAgTFZNX0lOVDE2ICAgTWF4VF9EZWxheVtdICA9IHtMVlJFVl9NQVhfVDBfREVMQVksIExWUkVWX01BWF9UMV9ERUxBWSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9UMl9ERUxBWSwgTFZSRVZfTUFYX1QzX0RFTEFZfTsKKyAgICAgICAgTFZNX0lOVDE2ICAgTWF4QVBfRGVsYXlbXSA9IHtMVlJFVl9NQVhfQVAwX0RFTEFZLCBMVlJFVl9NQVhfQVAxX0RFTEFZLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX0FQMl9ERUxBWSwgTFZSRVZfTUFYX0FQM19ERUxBWX07CisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBkZWxheSBsaW5lCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIFRlbXAxOyAgLyogdG8gYXZvaWQgUUFDIHdhcm5pbmcgb24gdHlwZSBjb252ZXJzaW9uICovCisKKyAgICAgICAgICAgICAgICBUZW1wMT0oTFZNX0ZMT0FUKURlbGF5TGVuZ3RoU2FtcGxlczsKKyAgICAgICAgICAgICAgICBUZW1wID0gKExWTV9VSU5UMzIpKFRlbXAxICogU2NhbGVUYWJsZVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUZW1wID0gRGVsYXlMZW5ndGhTYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVBEZWxheVNpemUgPSBUZW1wICAvIDE1MDA7CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgZml4ZWQgZGVsYXkKKyAgICAgICAgICAgICAqLworCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICBUZW1wICA9IChNYXhUX0RlbGF5W2ldIC0gTWF4QVBfRGVsYXlbaV0pICogRnMgLyAxOTIwMDA7CisjZWxzZQorICAgICAgICAgICAgVGVtcCAgPSAoTWF4VF9EZWxheVtpXSAtIE1heEFQX0RlbGF5W2ldKSAqIEZzIC8gNDgwMDA7CisjZW5kaWYKKyAgICAgICAgICAgIHBQcml2YXRlLT5EZWxheV9BUFtpXSA9IHBQcml2YXRlLT5UW2ldIC0gVGVtcDsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSB0YXAgc2VsZWN0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBBIHRvIHRhcCBCICovCisgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRCW2ldICAgICAgICAgICAgID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXAgLSBBUERlbGF5U2l6ZV07CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldICAgICAgICAgID0gQVBEZWxheVNpemU7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxID0gMDsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAxLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBCIHRvIHRhcCBBICovCisgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2ldICAgICAgICAgICAgID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXAgLSBBUERlbGF5U2l6ZV07CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldICAgICAgICAgID0gQVBEZWxheVNpemU7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQyID0gMDsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAxLjBmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgdG8gdGhlIHNtYWxsZXN0IGRlbGF5IHNpemUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiAgID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAxOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBMaW1pdCB0aGUgbWF4aW11bSBibG9jayBsZW5ndGgKKyAgICAgICAgICovCisgICAgICAgIC8qIEp1c3QgYXMgYSBwcmVjYXVzaW9uLCBidXQgbm8gcHJvYmxlbSBpZiB3ZSByZW1vdmUgdGhpcyBsaW5lICAgICAgKi8KKyAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5NYXhCbGtMZW4gLSAyOworICAgICAgICBpZihwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IChMVk1fSU5UMzIpcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgbG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGFtcGluZykgICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisKKyAgICAgICAgTFZNX0lOVDMyICAgICAgIFRlbXA7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworICAgICAgICBMVk1fSU5UMTYgICAgICAgaTsKKyAgICAgICAgTFZNX0lOVDE2ICAgICAgIERhbXBpbmcgICAgICA9IChMVk1fSU5UMTYpKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgKiAxMDApICsgMTAwMCk7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyXzBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfM19vbl80fTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIGZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoTFZNX0lOVDMyKShTY2FsZVRhYmxlW2ldICogRGFtcGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcCA9IERhbXBpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihUZW1wIDw9IChMVk1fSU5UMzIpKExWTV9Gc1RhYmxlW3BQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZV0gPj4gMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EoVGVtcCwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBMVk1fRk9fTFBGKE9tZWdhLCAmQ29lZmZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2VmZnMuQTAgPSAxOworICAgICAgICAgICAgICAgIENvZWZmcy5BMSA9IDA7CisgICAgICAgICAgICAgICAgQ29lZmZzLkIxID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbaV0sICZDb2VmZnMpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBBbGwtcGFzcyBmaWx0ZXIgbWl4ZXIgdGltZSBjb25zdGFudHMKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fRkxPQVQgICBBbHBoYTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQWxwaGFUYXA7CisKKyAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgICAgIEFscGhhVGFwID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RBUF9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTEgICAgICAgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGEyICAgICAgID0gQWxwaGFUYXA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5BbHBoYSAgICA9IEFscGhhOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGZlZWQgYmFjayBnYWluCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgICAgICAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKworICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBHWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogRmVlZGJhY2sgZ2FpbiAoUTcuMjQpICovCisKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgR1szXSA9IDA7CisgICAgICAgICAgICBHWzJdID0gMDsKKyAgICAgICAgICAgIEdbMV0gPSAwOworICAgICAgICAgICAgR1swXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fRkxPQVQgICBUZW1wMTsKKyAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXAyOworICAgICAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgICAgIExWTV9GTE9BVCAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNH07CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRlbXAxID0gKDMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zICogU2NhbGVUYWJsZVtpXSkgLyBwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MDsKKyAgICAgICAgICAgICAgICBpZihUZW1wMSA+PSAoNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHW2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZigoVGVtcDEgPj0gKDIpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRlbXAyID0gTFZNX1Bvd2VyMTAoLShUZW1wMSAvIDIuMGYpKTsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIC8gMi4wZikpOworICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IFRlbXAxICogVGVtcDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoTnVtYmVyT2ZEZWxheUxpbmVzID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHW2ldID0gVGVtcDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXBHOworICAgICAgICAgICAgICAgICAgICBUZW1wRyA9IFRlbXAxICogT05FX09WRVJfU1FSVF9UV087CisgICAgICAgICAgICAgICAgICAgIEdbaV09VGVtcEc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHVwIHRoZSBmZWVkYmFjayBtaXhlcnMgZm9yIGZvdXIgZGVsYXkgbGluZXMgKi8KKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMF0uVGFyZ2V0PUdbMF07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzFdLlRhcmdldD1HWzFdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsyXS5UYXJnZXQ9R1syXTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbM10uVGFyZ2V0PUdbM107CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpIHx8CisgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTGV2ZWwpICAgIHx8CisgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSApCisgICAgeworICAgICAgICBMVk1fSU5UMzIgSW5kZXg9MDsKKyAgICAgICAgTFZNX0ZMT0FUIEluZGV4X0ZMT0FUOworICAgICAgICBMVk1fSU5UMzIgaT0wOworICAgICAgICBMVk1fRkxPQVQgR2Fpbj0wOworICAgICAgICBMVk1fSU5UMzIgUm9vbVNpemU9MDsKKyAgICAgICAgTFZNX0ZMT0FUIFQ2MDsKKyAgICAgICAgTFZNX0ZMT0FUIENvZWZzWzVdOworCisKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBSb29tU2l6ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSb29tU2l6ZSA9IChMVk1fSU5UMzIpcFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPCAxMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFQ2MCA9IDEwMCAqIExWUkVWX1Q2MF9TQ0FMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFQ2MCA9IHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICogTFZSRVZfVDYwX1NDQUxFOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgbmVhcmVzdCByb29tIHNpemUgaW4gdGFibGUgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUm9vbVNpemUgPD0gTFZSRVZfR2FpblBvbHlUYWJsZVtpXVswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGlmKFJvb21TaXplID09IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUYWtlIHRhYmxlIHZhbHVlcyBpZiB0aGUgcm9vbSBzaXplIGlzIGluIHRhYmxlICovCisgICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29lZnNbNF0gPSAwOworICAgICAgICAgICAgR2FpbiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgICAvKiBRLjI0IHJlc3VsdCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgdGhlIGdhaW4gYmV0d2VlbiBuZWFyZXN0IHJvb20gc2l6ZXMgKi8KKworICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW4xLEdhaW4yOworICAgICAgICAgICAgTFZNX0lOVDMyIFRvdF9EaXN0LERpc3Q7CisKKyAgICAgICAgICAgIFRvdF9EaXN0ID0gKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0gLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXgtMV1bMF07CisgICAgICAgICAgICBEaXN0ID0gUm9vbVNpemUgLSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4IC0gMV1bMF07CisKKworICAgICAgICAgICAgLyogR2V0IGdhaW4gZm9yIGZpcnN0ICovCisgICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXgtMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XSA9IDA7CisKKyAgICAgICAgICAgIEdhaW4xID0gTFZNX1BvbHlub21pYWwoMywgQ29lZnMsIFQ2MCk7ICAgICAgLyogUS4yNCByZXN1bHQgKi8KKworICAgICAgICAgICAgLyogR2V0IGdhaW4gZm9yIHNlY29uZCAqLworICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZzW2ktMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvZWZzWzRdID0gMDsKKworICAgICAgICAgICAgR2FpbjIgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLworCisgICAgICAgICAgICAvKiBMaW5lYXIgSW50ZXJwb2xhdGUgdGhlIGdhaW4gKi8KKyAgICAgICAgICAgIEdhaW4gPSBHYWluMSArICgoKEdhaW4yIC0gR2FpbjEpICogRGlzdCkgLyAoVG90X0Rpc3QpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnZlcnNlIG9mIGdhaW46IFEuMTUKKyAgICAgICAgICogR2FpbiBpcyBtb3N0bHkgYWJvdmUgb25lIGV4Y2VwdCBmZXcgY2FzZXMsIHRha2Ugb25seSBnYWlucyBhYm92ZSAxCisgICAgICAgICAqLworICAgICAgICBpZihHYWluIDwgMSkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkdhaW4gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkdhaW4gPSAxIC8gR2FpbjsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4X0ZMT0FUID0gMTAwLjBmIC8gKExWTV9GTE9BVCkoMTAwICsgcFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCk7CisgICAgICAgIHBQcml2YXRlLT5HYWluID0gcFByaXZhdGUtPkdhaW4gKiBJbmRleF9GTE9BVDsKKyAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgPSAocFByaXZhdGUtPkdhaW4qSW5kZXhfRkxPQVQpIC8gMjsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBhbGwgcGFzcyBjb21iIGZpbHRlciBjb2VmZmljaWVudAorICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRlbnNpdHkpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0ZMT0FUICAgYiA9IChMVk1fRkxPQVQpcFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICogTFZSRVZfQl84X29uXzEwMDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uVGFyZ2V0ICAgID0gYjsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLlRhcmdldCA9IGI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudAorICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSAgIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgTU9OTyBmb3JtYXQgKi8KKyAgICAgICAgTFZNX0ZMT0FUICAgIEFscGhhOworCisgICAgICAgIEFscGhhID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9GRUVEQkFDS01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1DaGFubmVscyk7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzBdLkFscGhhID0gQWxwaGE7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzFdLkFscGhhID0gQWxwaGE7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLkFscGhhID0gQWxwaGE7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLkFscGhhID0gQWxwaGE7CisKKyAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsd2F5cyBzdGVyZW8gb3V0cHV0ICovCisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0JZUEFTU01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgTnVtQ2hhbm5lbHMpOworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGEyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5BbHBoYSAgICA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgYnlwYXNzIG1peGVyIHRhcmdldHMKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTGV2ZWwpICYmCisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICkgLyAxMDAuMGY7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApICYmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUpCisgICAgeworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKExWTV9GTE9BVCkocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCApIC8gMTAwLjBmOworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOworCisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSAgICAgICAgICAgICAgICAgICAgICA9IExWTV9NT0RFX09OOworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX0ZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IDB4MDAwMDAwMDA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICA9IDAuMDMxMjVmOworICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogIElmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIHRvIEFwcGx5TmV3IHNldHRpbmdzIGZvcmNlIHRoZSBjdXJyZW50IHRvIHRoZSB0YXJnZXQgXAorICAgICAgICB0byBiZWdpbiBpbW1lZGlhdGUgcGxheWJhY2sgb2YgdGhlIGVmZmVjdCAqLworICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQxID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDE7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBuZXcgcGFyYW1ldGVycworICAgICAqLworICAgIHBQcml2YXRlLT5DdXJyZW50UGFyYW1zID0gcFByaXZhdGUtPk5ld1BhcmFtczsKKyAgICBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID0gT3BlcmF0aW5nTW9kZTsKKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgZmxhZworICAgICAqLworICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPSBMVk1fRkFMU0U7CisgICAgfQorCisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCmluZGV4IDZiYjFlODguLjk0OTEwMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYwpAQCAtNjEsMTYgKzYxLDI2IEBACiAgICAgICogQ2xlYXIgYWxsIGZpbHRlciB0YXAgZGF0YSwgZGVsYXktbGluZXMgYW5kIG90aGVyIHNpZ25hbCByZWxhdGVkIGRhdGEKICAgICAgKi8KIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgMik7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgIDIpOworI2Vsc2UKICAgICBMb2FkQ29uc3RfMzIoMCwKICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwogICAgICAgICAyKTsKICAgICBMb2FkQ29uc3RfMzIoMCwKICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwogICAgICAgICAyKTsKLQorI2VuZGlmCiAgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOwpAQCAtODAsMjQgKzkwLDQ2IEBACiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDJfREVMQVkpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisjZWxzZQorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwogCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbM10sIExWUkVWX01BWF9UM19ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0sIExWUkVWX01BWF9UMl9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisjZW5kaWYKICAgICB9CiAKICAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID49IExWUkVWX0RFTEFZTElORVNfMikKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CiAKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMV9ERUxBWSk7CiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworI2Vsc2UKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworI2VuZGlmCiAgICAgfQogCiAgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzEpCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbHNlCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisjZW5kaWYKICAgICB9Ci0KICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKaW5kZXggZmZhNTEzOC4uMzM2NmJjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jCkBAIC0xMDgsMTEgKzEwOCwyOSBAQAogICAgIC8qCiAgICAgICogWmVybyBhbGwgbWVtb3J5IHJlZ2lvbnMKICAgICAgKi8KLSAgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKLSAgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKLSAgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKLSAgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyNlbHNlCisgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKKyAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOworICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKKyNlbmRpZgogICAgIC8qCiAgICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKICAgICAgKi8KQEAgLTE0Niw3ICsxNjQsNyBAQAogICAgICAqIFNldCB0aGUgZGF0YSwgY29lZmZpY2llbnQgYW5kIHRlbXBvcmFyeSBtZW1vcnkgcG9pbnRlcnMKICAgICAgKi8KICAgICBwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIHNpemVvZihMVlJFVl9GYXN0RGF0YV9zdCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCiAgICAgewogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbM10gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAgKiBzaXplb2YoTFZNX0lOVDMyKSk7CkBAIC0xOTAsNyArMjA4LDY3IEBACiAKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAsIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKICAgICB9CisjZWxzZQorICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CiAKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgTFZSRVZfTUFYX1QzX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSwgTFZSRVZfTUFYX1QyX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyAgICB9CisKKyAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0gID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyAgICB9CisjZW5kaWYKICAgICAvKiBBbGwtcGFzcyBkZWxheSBidWZmZXIgYWRkcmVzc2VzIGFuZCBzaXplcyAqLwogICAgIHBMVlJFVl9Qcml2YXRlLT5UWzBdICAgICAgICAgPSBMVlJFVl9NQVhfVDBfREVMQVk7CiAgICAgcExWUkVWX1ByaXZhdGUtPlRbMV0gICAgICAgICA9IExWUkVWX01BWF9UMV9ERUxBWTsKQEAgLTIwMCwxMCArMjc4LDE5IEBACiAKIAogICAgIHBMVlJFVl9Qcml2YXRlLT5wRmFzdENvZWYgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0Q29lZiwgc2l6ZW9mKExWUkVWX0Zhc3RDb2VmX3N0KSk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBjb2VmZmljaWVudCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCAqLwogICAgIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmUgZm9yIGVuZCBtaXggKi8KICAgICBMb2FkQ29uc3RfMzIoMCwgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUsIChMVk1fSU5UMTYpKE1heEJsb2NrU2l6ZSoyKSk7Ci0KKyNlbHNlCisgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlIGZvciBlbmQgbWl4ICovCisgICAgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlLCAoTFZNX0lOVDE2KShNYXhCbG9ja1NpemUgKiAyKSk7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2F2ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCkBAIC0yNTIsOSArMzM5LDEzIEBACiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wR2VuZXJhbFB1cnBvc2UgICAgPSBMVk1fTlVMTDsKICAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOwogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ2FsbGJhY2tTZXQgICAgICAgID0gTFZNX0ZBTFNFOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ3VycmVudCAgICAgICAgICAgID0gMHgwM2ZmZmZmZjsKICAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICAgICAgICAgICA9IDB4MDNmZmZmZmY7Ci0KKyNlbHNlCisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ICAgICAgICAgICAgPSAwLjAzMTI1ZjsvLzB4MDNmZmZmZmY7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgICAgICAgICAgICAgPSAwLjAzMTI1ZjsvLzB4MDNmZmZmZmY7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBBbGwtUGFzcyBGaWx0ZXIgbWl4ZXJzCkBAIC0yNzcsNyArMzY4LDExIEBACiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMSAgICAgICA9IExWTV9OVUxMOwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MSAgICAgPSBMVk1fRkFMU0U7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDEgICAgICAgICA9IDA7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSAgICAgICAgICA9IDB4N2ZmZmZmZmY7CisjZWxzZQorICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgICAgICAgICAgPSAxOworI2VuZGlmCiAgICAgICAgIC8qIEZlZWRmb3J3YXJkIG1peGVyICovCiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLkNhbGxiYWNrUGFyYW0gICA9IDA7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMKaW5kZXggMjAxMjQzMi4uZjZkNDQ2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCkBAIC0xNjEsMjEgKzE2MSwzNyBAQAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgc2l6ZW9mKExWUkVWX0Zhc3REYXRhX3N0KSk7CiAgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAgKiBzaXplb2YoTFZNX0lOVDMyKSk7CiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworI2Vsc2UKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisjZWxzZQorICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyNlbHNlCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRmFzdERhdGEpOwpAQCAtMTk1LDE0ICsyMTEsMjUgQEAKICAgICAgICAgLyoKICAgICAgICAgICogVGVtcG9yYXJ5IGZhc3QgbWVtb3J5CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggbWVtb3J5ICovCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMipzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZWQgZm9yIGVuZCBtaXggKi8KLQorI2Vsc2UKKyAgICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworICAgICAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZWQgZm9yIGVuZCBtaXggKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyICogc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICAgICAgewogICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyBpKyspCiAgICAgICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisjZWxzZQorICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjEwLDcgKzIzNywxMiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IoaT0wOyBpPDI7IGkrKykKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMTgsNyArMjUwLDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvcihpPTA7IGk8MTsgaSsrKQogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAppbmRleCBmYmZhNDM3Li5mZjc0NzVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCkBAIC00MiwxNiArNDIsMjcgQEAKIC8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgT05FX09WRVJfU1FSVF9UV08gICAgICAgICAgICAgICAyMzE3MCAgICAgICAgICAgLyogMS9zcXJ0KDIpICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl9CXzhfb25fMTAwMCAgICAgICAgICAgIDE3MTc5ODY5ICAgICAgICAgICAvKiAwLjggKiAyXjMxICovCiAjZGVmaW5lIExWUkVWX0hFQURST09NICAgICAgICAgICAgICAgICAgIDgxOTIgICAgICAgICAgIC8qIC0xMmRCICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl8yXzlfSU5RMjkgICAgICAgICAgIDE1ODM3NjkxOTBMICAgICAgICAgICAvKiAyLjkgaW4gUTI5IGZvcm1hdCAqLwogI2RlZmluZSBMVlJFVl9NSU4zREIgICAgICAgICAgICAgICAgICAgMHg1QTgyICAgICAgICAgICAvKiAtM2RCIGluIFExNSBmb3JtYXQgKi8KKyNlbHNlCisvKiBHZW5lcmFsICovCisjZGVmaW5lIE9ORV9PVkVSX1NRUlRfVFdPICAgICAgICAgICAgMC43MDcxMDdmICAgICAgICAgICAvKiAxL3NxcnQoMikgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX0JfOF9vbl8xMDAwICAgICAgICAgICAgICAgMC4wMDhmICAgICAgICAgICAvKiAwLjggKiAyXjMxICovCisjZGVmaW5lIExWUkVWX0hFQURST09NICAgICAgICAgICAgICAgICAgIDAuMjVmICAgICAgICAgICAvKiAtMTJkQiAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfMl85X0lOUTI5ICAgICAgICAgICAgICAgICAgIDIuOWYgICAgICAgICAgIC8qIDIuOSBpbiBRMjkgZm9ybWF0ICovCisjZGVmaW5lIExWUkVWX01JTjNEQiAgICAgICAgICAgICAgICAwLjcwNzk0NTdmICAgICAgICAgICAvKiAtM2RCIGluIFExNSBmb3JtYXQgKi8KKyNlbmRpZgogCiAvKiBJbnRlbmFsIGNvbnN0YW50cyAqLwogI2RlZmluZSBMVlJFVl9MUF9Qb2x5X09yZGVyICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIExWUkVWX0xQX1BvbHlfU2hpZnQgICAgICAgICAgICAgICAgIDUKKworI2lmbmRlZiBCVUlMRF9GTE9BVAogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMF9vbl80ICAgICAgICAgIDMyNzY4CiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8xX29uXzQgICAgICAgICAgNDMxMjUKICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCAgICAgICAgICA1Njc1NQpAQCAtNjEsMTQgKzcyLDQ3IEBACiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCAgICAgMjQ4OTggICAgICAgICAgIC8qIDNeKC0xLzQpICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQgICAgIDE4OTE5ICAgICAgICAgICAvKiAzXigtMi80KSAqIDJeMTUgKi8KICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80ICAgICAxNDM3NSAgICAgICAgICAgLyogM14oLTMvNCkgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWX01BWF9UM19ERUxBWSAgICAgICAgICAgICAgIDI1MjcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QyX0RFTEFZICAgICAgICAgICAgICAgMzMyNiAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDFfREVMQVkgICAgICAgICAgICAgICA0Mzc3ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UMF9ERUxBWSAgICAgICAgICAgICAgIDU3NjAgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQM19ERUxBWSAgICAgICAgICAgICAgMTY4NSAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAyX0RFTEFZICAgICAgICAgICAgICAyMjE4ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDFfREVMQVkgICAgICAgICAgICAgIDI5MTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMF9ERUxBWSAgICAgICAgICAgICAgMzg0MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2Vsc2UvKkJVSUxEX0ZMT0FUKi8KKyNkZWZpbmUgTFZSRVZfVDYwX1NDQUxFICAgICAgICAgICAgICAgIDAuMDAwMTQyZiAgICAgICAgICAgLyooMS83MDAwKSAqLworCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8wX29uXzQgICAgICAgICAgICAgIDEuMGYKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCAgICAgICAgIDEuMzE2MDc0ZgorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMl9vbl80ICAgICAgICAgMS43MzIwNTFmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8zX29uXzQgICAgICAgICAyLjI3OTUwN2YKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80ICAgICAgICAgMS4wZiAgICAgICAgLyogM14oLTAvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCAgICAwLjc1OTgzNmYgICAgICAgIC8qIDNeKC0xLzQpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQgICAgMC41NzczNTBmICAgICAgICAvKiAzXigtMi80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80ICAgIDAuNDM4NjkxZiAgICAgICAgLyogM14oLTMvNCkgKiAyXjE1ICovCisjZW5kaWYKKworI2lmbmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgIDI1MjcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QyX0RFTEFZICAgICAgICAgICAgICAgIDMzMjYgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZICAgICAgICAgICAgICAgIDQzNzcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgIDU3NjAgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQM19ERUxBWSAgICAgICAgICAgICAgIDE2ODUgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSAgICAgICAgICAgICAgIDIyMTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgIDI5MTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMF9ERUxBWSAgICAgICAgICAgICAgIDM4NDAgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNlbHNlCisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgMTAxMDgKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAxMzMwNAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMV9ERUxBWSAgICAgICAgICAgICAgIDE3NTA4CisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgMjMwNDAKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAgNjc0MAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDJfREVMQVkgICAgICAgICAgICAgICA4ODcyCisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgMTE2NzIKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAxNTM2MAorI2VuZGlmCisKICNkZWZpbmUgTFZSRVZfQllQQVNTTUlYRVJfVEMgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQqLwogI2RlZmluZSBMVlJFVl9BTExQQVNTX1RDICAgICAgICAgICAgICAgICAxMDAwICAgICAgICAgICAvKiBBbGwtcGFzcyBmaWx0ZXIgdGltZSBjb25zdGFudCAqLwogI2RlZmluZSBMVlJFVl9BTExQQVNTX1RBUF9UQyAgICAgICAgICAgICAxMDAwMCAgICAgICAgICAgLyogQWxsLXBhc3MgZmlsdGVyIGRlbHkgdGFwIGNoYW5nZSAqLwpAQCAtNzYsNyArMTIwLDEyIEBACiAjZGVmaW5lIExWUkVWX09VVFBVVEdBSU5fU0hJRlQgICAgICAgICAgICAgIDUgICAgICAgICAgIC8qIEJpdHMgc2hpZnQgZm9yIG91dHB1dCBnYWluIGNvcnJlY3Rpb24gKi8KIAogLyogUGFyYW1ldGVyIGxpbWl0cyAqLworI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KKyNlbHNlCisjZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCisjZW5kaWYKKwogI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCiAjZGVmaW5lIExWUkVWX01BWF9MRVZFTCAgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gbGV2ZWwsIDEwMCUgKi8KICNkZWZpbmUgTFZSRVZfTUlOX0xQRl9DT1JORVIgICAgICAgICAgICAgICA1MCAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIGxpbWl0cyAqLwpAQCAtOTUsNiArMTQ0LDcgQEAKIC8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qIEZhc3QgZGF0YSBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xNjEsNyArMjExLDgxIEBACiAKIH0gTFZSRVZfSW5zdGFuY2Vfc3Q7CiAKKyNlbHNlIC8qIEJVSUxEX0ZMT0FUICovCiAKKy8qIEZhc3QgZGF0YSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgSFBUYXBzOyAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgdGFwcyAqLworICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IExQVGFwczsgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgdGFwcyAqLworICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IFJldkxQVGFwc1s0XTsgICAgICAgICAgICAgICAvKiBSZXZlcmIgbG93IHBhc3MgZmlsdGVycyB0YXBzICovCisKK30gTFZSRVZfRmFzdERhdGFfc3Q7CisKKworLyogRmFzdCBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBIUENvZWZzOyAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBMUENvZWZzOyAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFJldkxQQ29lZnNbNF07ICAgICAgICAvKiBSZXZlcmIgbG93IHBhc3MgZmlsdGVycyBjb2VmZmljaWVudHMgKi8KKworfSBMVlJFVl9GYXN0Q29lZl9zdDsKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCAqLworICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0IEluc3RhbmNlUGFyYW1zOyAgICAgICAgICAgLyogSW5pdGlhbGlzYXRpb24gdGltZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgTWVtb3J5VGFibGU7ICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICBDdXJyZW50UGFyYW1zOyAgICAgICAgICAgIC8qIFBhcmFtZXRlcnMgYmVpbmcgdXNlZCAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgIE5ld1BhcmFtczsgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgZnJvbSB0aGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyBhcHBsaWNhdGlvbiAqLworICAgIExWTV9DSEFSICAgICAgICAgICAgICAgIGJDb250cm9sUGVuZGluZzsgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBuZXcgcGFyYW1ldGVycyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkZpcnN0Q29udHJvbDsgICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbnRyb2wgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSAqLworICAgIExWTV9DSEFSICAgICAgICAgICAgICAgIGJEaXNhYmxlUmV2ZXJiOyAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtaXggbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIGFuZCB0aGUgcmV2ZXJiIGNhbiBiZSBkaXNhYmxlZCAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFJvb21TaXplSW5tczsgICAgICAgICAgICAgLyogUm9vbSBzaXplIGluIG1zZWMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBNYXhCbGtMZW47ICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBmb3IgaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgKi8KKworICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCisgICAgTFZSRVZfRmFzdERhdGFfc3QgICAgICAgKnBGYXN0RGF0YTsgICAgICAgICAgICAgICAvKiBGYXN0IGRhdGEgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIExWUkVWX0Zhc3RDb2VmX3N0ICAgICAgICpwRmFzdENvZWY7ICAgICAgICAgICAgICAgLyogRmFzdCBjb2VmZmljaWVudCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoRGVsYXlMaW5lWzRdOyAgICAvKiBEZWxheSBsaW5lIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAgICAgICAvKiBNdWx0aSB1c3NnZSBzY3JhdGNoICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBJbnB1dFNhdmU7ICAgICAgICAgICAgICAvKiBSZXZlcmIgYmxvY2sgaW5wdXQgc2F2ZSBmb3IgZHJ5L3dldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW5nKi8KKworICAgIC8qIEZlZWRiYWNrIG1hdHJpeCAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIEZlZWRiYWNrTWl4ZXJbNF07ICAgICAgICAgLyogTWl4ZXIgZm9yIFBvcCBhbmQgQ2xpY2sgU3VwcmVzc2lvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWQgYnkgZmVlZGJhY2sgR2FpbiAqLworCisKKyAgICAvKiBBbGwtUGFzcyBGaWx0ZXIgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBUWzRdOyAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gZGVsYXkgc2l6ZSBvZiBidWZmZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERlbGF5X1RbNF07ICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGVsYXkgYnVmZmVycyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIERlbGF5X0FQWzRdOyAgICAgICAgICAgICAgLyogT2Zmc2V0IHRvIEFQIGRlbGF5IGJ1ZmZlciBzdGFydCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEFCX1NlbGVjdGlvbjsgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gQiB3aGVuIDEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIEIgdG8gQSAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEFfRGVsYXlTaXplWzRdOyAgICAgICAgICAgLyogQSBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJfRGVsYXlTaXplWzRdOyAgICAgICAgICAgLyogQiBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT2Zmc2V0QVs0XTsgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciB0aGUgQSBkZWxheSB0YXAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE9mZnNldEJbNF07ICAgICAgICAgICAgIC8qIE9mZnNldCBmb3IgdGhlIEIgZGVsYXkgdGFwICovCisgICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfQVBUYXBzWzRdOyAgICAgICAgICAvKiBTbW9vdGhlZCBBUCBkZWxheSBtaXhlciAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIE1peGVyX1NHRmVlZGJhY2tbNF07ICAgICAgLyogU21vb3RoZWQgU0FmZWVkYmFjayBnYWluICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfU0dGZWVkZm9yd2FyZFs0XTsgICAvKiBTbW9vdGhlZCBBUCBmZWVkZm9yd2FyZCBnYWluICovCisKKyAgICAvKiBPdXRwdXQgZ2FpbiAqLworICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgIEJ5cGFzc01peGVyOyAgICAgICAgICAgICAgLyogRHJ5L3dldCBtaXhlciAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiBhcHBsaWVkIHRvIG91dHB1dCB0byBtYWludGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSBzaWduYWwgcG93ZXIgKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBHYWluTWl4ZXI7ICAgICAgICAgICAgICAgIC8qIEdhaW4gc21vb3RoaW5nICovCisKK30gTFZSRVZfSW5zdGFuY2Vfc3Q7CisKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTY5LDEyICsyOTMsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICBMVlJFVl9BcHBseU5ld1NldHRpbmdzKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgICAgICAgICAgICAgICAgICAgIFJldmVyYkJsb2NrKExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICpwUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQogdm9pZCAgICAgICAgICAgICAgICAgICAgUmV2ZXJiQmxvY2soTFZNX0lOVDMyICAgICAgICAgICAqcElucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAqcE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBQcml2YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCiBMVk1fSU5UMzIgICAgICAgICAgICAgICBCeXBhc3NNaXhlcl9DYWxsYmFjayh2b2lkICAgICAgICpwQ2FsbGJhY2tEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBHZW5lcmFsUHVycG9zZSApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCmluZGV4IDVjN2E4YTAuLjU2NmQ4NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKQEAgLTQ2LDE0ICs0NiwyNiBAQAogLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgTnVtU2FtcGxlcykKKyNlbHNlCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgTnVtU2FtcGxlcykKKyNlbmRpZgogewogICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5wdXQgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXRwdXQgPSBwT3V0RGF0YTsKKyNlbHNlCiAgICBMVk1fSU5UMzIgICAgICAgICAgICAgKnBJbnB1dCAgPSAoTFZNX0lOVDMyICopcEluRGF0YTsKICAgIExWTV9JTlQzMiAgICAgICAgICAgICAqcE91dHB1dCA9IHBPdXREYXRhOworI2VuZGlmCiAgICBMVk1fSU5UMzIgICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcywgUmVtYWluaW5nU2FtcGxlczsKICAgIExWTV9JTlQzMiAgICAgICAgICAgICBmb3JtYXQgPSAxOwogCkBAIC0xMDUsNyArMTE3LDcgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBjb252ZXJ0IHRvIHN0ZXJlbyBpcyByZXF1aXJlZAogICAgICAgICAgICAgICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIGlmKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTyl7CiAgICAgICAgICAgICAgICAgTW9ub1RvMklfMzIocElucHV0LCBwT3V0cHV0LCBOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMTMsNiArMTI1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMikpOyAvLyAzMiBiaXQgZGF0YSwgc3RlcmVvCiAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgaWYocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKXsKKyAgICAgICAgICAgICAgICBNb25vVG8ySV9GbG9hdChwSW5wdXQsIHBPdXRwdXQsIE51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsgLy8gMzIgYml0IGRhdGEsIHN0ZXJlbworICAgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKQEAgLTE0Myw5ICsxNjQsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIFJldmVyYkJsb2NrKHBJbnB1dCwgcE91dHB1dCwgcExWUkVWX1ByaXZhdGUsIChMVk1fVUlOVDE2KVNhbXBsZXNUb1Byb2Nlc3MpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcElucHV0ICA9IChMVk1fRkxPQVQgKikocElucHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiBmb3JtYXQpKTsKKyAgICAgICAgcE91dHB1dCA9IChMVk1fRkxPQVQgKikocE91dHB1dCArIChTYW1wbGVzVG9Qcm9jZXNzICogMikpOyAgICAgIC8vIEFsd2F5cyBzdGVyZW8gb3V0cHV0CisjZWxzZQogICAgICAgICBwSW5wdXQgID0gKExWTV9JTlQzMiAqKShwSW5wdXQgKyhTYW1wbGVzVG9Qcm9jZXNzKmZvcm1hdCkpOwotICAgICAgICBwT3V0cHV0ID0gKExWTV9JTlQzMiAqKShwT3V0cHV0KyhTYW1wbGVzVG9Qcm9jZXNzKjIpKTsgICAgICAvLyBBbHdheXMgc3RlcmVvIG91dHB1dAorICAgICAgICBwT3V0cHV0ID0gKExWTV9JTlQzMiAqKShwT3V0cHV0KyhTYW1wbGVzVG9Qcm9jZXNzKjIpKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwpAQCAtMTc1LDcgKzIwMCw3IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgUmV2ZXJiQmxvY2soTFZNX0lOVDMyICpwSW5wdXQsIExWTV9JTlQzMiAqcE91dHB1dCwgTFZSRVZfSW5zdGFuY2Vfc3QgKnBQcml2YXRlLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCiB7CiAgICAgTFZNX0lOVDE2ICAgaiwgc2l6ZTsKQEAgLTQ3OSw3ICs1MDQsMzIyIEBACiAKICAgICByZXR1cm47CiB9CisjZWxzZQordm9pZCBSZXZlcmJCbG9jayhMVk1fRkxPQVQgKnBJbnB1dCwgTFZNX0ZMT0FUICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZV9zdCAqcFByaXZhdGUsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKK3sKKyAgICBMVk1fSU5UMTYgICBqLCBzaXplOworICAgIExWTV9GTE9BVCAgICpwRGVsYXlMaW5lOworICAgIExWTV9GTE9BVCAgICpwRGVsYXlMaW5lSW5wdXQgPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0ZMT0FUICAgKnBTY3JhdGNoID0gcFByaXZhdGUtPnBTY3JhdGNoOworICAgIExWTV9GTE9BVCAgICpwSW47CisgICAgTFZNX0ZMT0FUICAgKnBUZW1wID0gcFByaXZhdGUtPnBJbnB1dFNhdmU7CisgICAgTFZNX0lOVDMyICAgTnVtYmVyT2ZEZWxheUxpbmVzOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEFsbCBjYWxjdWxhdGlvbnMgd2lsbCBnbyBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBwVGVtcCwgdGhpcyB3aWxsICAgICoKKyAgICAgKiB0aGVuIGJlIG1peGVkIHdpdGggdGhlIG9yaWdpbmFsIGlucHV0IHRvIGNyZWF0ZSB0aGUgZmluYWwgb3V0cHV0LiAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFdoZW4gSU5QTEFDRSBwcm9jZXNzaW5nIGlzIHNlbGVjdGVkIHRoaXMgbXVzdCBiZSBhIHRlbXBvcmFyeSBidWZmZXIgYW5kICAgICoKKyAgICAgKiBoZW5jZSB0aGlzIGlzIHRoZSB3b3JzdCBjYXNlLCBzbyBmb3Igc2ltcGxpY2l0eSB0aGlzIHdpbGwgQUxXQVlTIGJlIHNvICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW50b3VjaGVkIHVudGlsIHRoZSBvdXRwdXQgb2YgdGhlIG1peGVyIGlmICAgICoKKyAgICAgKiBJTlBMQUNFIHByb2Nlc3NpbmcgaXMgc2VsZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFRoZSB0ZW1wIGJ1ZmZlciB3aWxsIGFsd2F5cyBiZSBOdW1TYW1wbGVzIGluIHNpemUgcmVnYXJkbGVzcyBvZiBNT05PIG9yICAgICoKKyAgICAgKiBTVEVSRU8gaW5wdXQuIEluIHRoZSBjYXNlIG9mIHN0ZXJlbyBpbnB1dCBhbGwgcHJvY2Vzc2luZyBpcyBkb25lIGluIE1PTk8gICAqCisgICAgICogYW5kIHRoZSBmaW5hbCBvdXRwdXQgaXMgY29udmVydGVkIHRvIFNURVJFTyBhZnRlciB0aGUgbWl4ZXIgICAgICAgICAgICAgICAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDQ7CisgICAgfQorICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAxOworICAgIH0KKworICAgIGlmKHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTykKKyAgICB7CisgICAgICAgIHBJbiA9IHBJbnB1dDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogIFN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb24KKyAgICAgICAgICovCisKKyAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgcEluID0gcFRlbXA7CisgICAgfQorCisgICAgTXVsdDNzX0Zsb2F0KHBJbiwKKyAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVlJFVl9IRUFEUk9PTSwKKyAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAvKgorICAgICAqICBIaWdoIHBhc3MgZmlsdGVyCisgICAgICovCisgICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPkhQQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAvKgorICAgICAqICBMb3cgcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIAorICAgIC8qCisgICAgICogIFByb2Nlc3MgYWxsIGRlbGF5IGxpbmVzCisgICAgICovCisKKyAgICBmb3IoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykKKyAgICB7CisgICAgICAgIHBEZWxheUxpbmUgPSBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbal07CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQWxsLXBhc3MgZmlsdGVyIHdpdGggcG9wIGFuZCBjbGljayBzdXBwcmVzc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgLyogR2V0IHRoZSBzbW9vdGhlZCwgZGVsYXllZCBvdXRwdXQuIFB1dCBpdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBSZS1hbGlnbiB0aGUgYWxsIHBhc3MgZmlsdGVyIGRlbGF5IGJ1ZmZlciBhbmQgY29weWluZyB0aGUgZml4ZWQgZGVsYXkgZGF0YSBcCisgICAgICAgICAgIHRvIHRoZSBBUCBkZWxheSBpbiB0aGUgcHJvY2VzcyAqLworICAgICAgICBDb3B5X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBEZWxheV9UW2pdLAorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKHBQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlcykpOyAgICAgICAgIC8qIDMyLWJpdCBkYXRhICovCisgICAgICAgIC8qIEFwcGx5IHRoZSBzbW9vdGhlZCBmZWVkYmFjayBhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgZGVsYXkgbGluZSAqLworICAgICAgICBNYWMzc19TYXRfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgLTEuMGYsICAgIC8qIEludmVydCBzaW5jZSB0aGUgZmVlZGJhY2sgY29lZmZpY2llbnQgaXMgbmVnYXRpdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPkRlbGF5X0FQW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBBcHBseSBzbW9vdGhlZCBmZWVkZm9yd2FyZCBzYW5kIHNhdmUgdG8gZml4ZWQgZGVsYXkgaW5wdXQgKGN1cnJlbnRseSBlbXB0eSkgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgLyogU3VtIGludG8gdGhlIEFQIG91dHB1dCAqLworICAgICAgICBNYWMzc19TYXRfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqICBGZWVkYmFjayBnYWluCisgICAgICAgICAqLworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltqXSwgcERlbGF5TGluZSwgcERlbGF5TGluZSwgTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIExvdyBwYXNzIGZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgQXBwbHkgcm90YXRpb24gbWF0cml4IGFuZCBkZWxheSBzYW1wbGVzCisgICAgICovCisgICAgZm9yKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspCisgICAgeworCisgICAgICAgIENvcHlfRmxvYXQocFRlbXAsCisgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogIFJvdGF0aW9uIG1hdHJpeCBtaXgKKyAgICAgICAgICovCisgICAgICAgIHN3aXRjaChqKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMSBhbmQgMiBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAzIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAzIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMSBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICBERVNUSU5BVElPTiovCisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAgRGVsYXkgc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdChwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgIC8qIDMyLWJpdCBkYXRhICovCisgICAgfQogCiAKKyAgICAvKgorICAgICAqICBDcmVhdGUgc3RlcmVvIG91dHB1dAorICAgICAqLworICAgIHN3aXRjaChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzKQorICAgIHsKKyAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzQ6CisgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworCisgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU18yOgorCisgICAgICAgICAgICAgQ29weV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsKKworICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworCisgICAgICAgICAgICAgSm9pblRvMmlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzE6CisgICAgICAgICAgICBNb25vVG8ySV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiAgRHJ5L3dldCBtaXhlcgorICAgICAqLworCisgICAgc2l6ZSA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSk7CisgICAgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCgmcFByaXZhdGUtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIC8qIEFwcGx5IEdhaW4qLworCisgICAgU2hpZnRfU2F0X0Zsb2F0KExWUkVWX09VVFBVVEdBSU5fU0hJRlQsCisgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPkdhaW5NaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qIEVuZCBvZiBmaWxlICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCmluZGV4IGY1ODk1YTcuLmE3MTkwNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwpAQCAtNjEsMTAgKzYxLDE1IEBACiAgICAgICogQ2hlY2sgYWxsIG5ldyBjb250cm9sIHBhcmFtZXRlcnMgYXJlIGluIHJhbmdlCiAgICAgICovCiAgICAgaWYoICAgICgocE5ld1BhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09OKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICgocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCisgICAgICAgICgKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgotICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSkgICAgICB8fAotICAgICAgICAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkKKyNlbmRpZgorICAgICAgICApCisgICAgICAgIHx8ICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpICkKICAgICB7CiAgICAgICAgIHJldHVybiAoTFZSRVZfT1VUT0ZSQU5HRSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwppbmRleCA1YTZkNDNkLi5iM2VkYzYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwpAQCAtMjksNiArMjksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFRhYmxlIHdpdGggc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzLiAgVGhlIHRhYmxlIGNhbiBiZSBpbmRleGVkIHVzaW5nIExWTV9Gc19lbiAgICAgICAqLworI2lmbmRlZiBISUdIRVJfRlMKIGNvbnN0IExWTV9VSU5UMTYgTFZNX0ZzVGFibGVbXSA9IHsKICAgICA4MDAwICwKICAgICAxMTAyNSwKQEAgLTQwLDE0ICs0MSwzNyBAQAogICAgIDQ0MTAwLAogICAgIDQ4MDAwCiB9OwotCisjZWxzZQorY29uc3QgTFZNX1VJTlQzMiBMVk1fRnNUYWJsZVtdID0geworICAgIDgwMDAgLAorICAgIDExMDI1LAorICAgIDEyMDAwLAorICAgIDE2MDAwLAorICAgIDIyMDUwLAorICAgIDI0MDAwLAorICAgIDMyMDAwLAorICAgIDQ0MTAwLAorICAgIDQ4MDAwLAorICAgIDk2MDAwLAorICAgIDE5MjAwMAorfTsKKyNlbmRpZgogLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCisjaWZuZGVmIEhJR0hFUl9GUwogTFZNX1VJTlQxNiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpewogICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzQ4MDAwKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIHJldHVybiAoTFZNX0ZzVGFibGVbRnNJbmRleF0pOwogfQorI2Vsc2UKK0xWTV9VSU5UMzIgTFZNX0dldEZzRnJvbVRhYmxlKExWTV9Gc19lbiBGc0luZGV4KXsKKyAgICBpZiAoRnNJbmRleCA+IExWTV9GU18xOTIwMDApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIChMVk1fRnNUYWJsZVtGc0luZGV4XSk7Cit9CisjZW5kaWYKIAogLyogSW4gb3JkZXIgdG8gbWFpbnRhaW4gY29uc2lzdGFudCBpbnB1dCBhbmQgb3V0IHB1dCBzaWduYWwgc3RyZW5ndGhzCiAgICBvdXRwdXQgZ2Fpbi9hdHRlbnVhdGlvbiBpcyBhcHBsaWVkLiBUaGlzIGdhaW4gZGVwZW5kcyBvbiBUNjAgYW5kIFJvb21zCkBAIC02OSw2ICs5Myw3IEBACiAgICovCiAKIC8qIE5vcm1hbGl6aW5nIG91dHB1dCBpbmNsdWRpbmcgUmV2ZXJiIExldmVsIHBhcnQgKG9ubHkgc2hpZnQgdXApKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQzMiBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XT17ezEsMTc1NDc0MzQsMTI4ODY3NDM0LC0xMjA5ODg4OTYsNTA3NjEyMjgsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsMTgyNTY4NjksMTcyNjY2OTAyLC0xOTMxNjkyOTIsODgzNDU3NDQsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsMTY1OTEzMTEsMTM5MjUwMTUxLC0xNDk2NjcyMzQsNjY3NzAwNTksfSwKQEAgLTk0LDYgKzExOSwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OTAsMTYwMDMzMjIsNDgzMjM2NjEsLTM1NjA3Mzc4LDEzMTUzODcyLH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMDAsMTU5NTUyMjMsNDg1NTgyMDEsLTMzNzA2ODY1LDExNzE1NzkyLH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KKyNlbHNlCitjb25zdCBMVk1fRkxPQVQgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV09e3sxLDEuMDQ1OTA5Ziw3LjY4MTA5OGYsLTcuMjExNTAwZiwzLjAyNTYwNWYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsMS4wODgxOTRmLDEwLjI5MTc0OWYsLTExLjUxMzc4N2YsNS4yNjU4MTdmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLDAuOTg4OTE5Ziw4LjI5OTk1NmYsLTguOTIwODYyZiwzLjk3OTgwNmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQsMS4wMzU5MjdmLDEwLjE4MjU2N2YsLTEwLjM0NjEzNGYsNC41NDY1MzNmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1LDEuMTMwMzEzZiwxMi41Mzg3MjdmLC0xMy42MjcwMjNmLDYuMTY1MjA4Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NiwxLjA2MDc0M2YsOC4wOTE3MTNmLC04LjU4ODA3OWYsMy44MzQyMzBmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3LDEuMDQwMzgxZiwxMC40MDY1NjZmLC0xMS4xNzY2NTBmLDUuMDc1MTMyZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OCwxLjAyNjk0NGYsOC4zODczMDJmLC04LjY4OTc5NmYsMy44OTU4NjNmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5LDEuMDEzMzEyZiw5LjcyNzIzNmYsLTEwLjUzNDE2NWYsNC43NDIyNzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMCwwLjk5NjA5NWYsOC40OTIyNDlmLC03Ljk0NzY3N2YsMy40Nzg5MTdmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMywxLjA3OTM0NmYsOC44OTQ0MjVmLC05LjY0MTc2OGYsNC40MzQ0NDJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxNSwwLjk5NDMyN2YsNy40NDEzMzVmLC04LjAwMzk3OWYsMy41ODExNzdmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxNywwLjk5MTA2N2YsNy4yMDgzNzNmLC03LjI1Nzg1OWYsMy4xNjc3NzRmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyMCwxLjAzMzQ0NWYsNy40NzYzNzFmLC03LjU0Njk2MGYsMy4zNjk3MDNmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyNSwwLjk4MjgzMGYsNS45MTM4NjdmLC01LjYzODQ0OGYsMi40MjA5MzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMCwwLjkyODc4MmYsNS4wMzUzNDNmLC00LjQ5MjEwNGYsMS44NDQ5MDRmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0MCwwLjk1MzcxNGYsNS4wNjAyMzJmLC00LjQ3MjIwNGYsMS44Mjk2NDJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1MCwwLjg5OTI1OGYsNC4yNzMzNTdmLC0zLjUzNzQ5MmYsMS4zODc1NzZmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2MCwwLjk0MzU4NGYsNC4wOTMyMjhmLC0zLjQ2OTY1OGYsMS40MTA5MTFmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3MCwwLjkyNjAyMWYsMy45NzMxMjVmLC0zLjMzMTk4NWYsMS4zNDQ2OTBmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3NSwwLjg5NDg1M2YsMi44NzE3NDdmLC0xLjQzODc1OGYsMC4zMTE4NTZmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs4MCwwLjkzNTEyMmYsMi45OTE4NTdmLC0yLjAzODg4MmYsMC42ODYzOTVmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5MCwwLjk1Mzg3MmYsMi44ODAzMTVmLC0yLjEyMjM2NWYsMC43ODQwMzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMDAsMC45NTEwMDVmLDIuODk0Mjk0ZiwtMi4wMDkwODZmLDAuNjk4MzE2Zix9LAorfTsKKyNlbmRpZgogLyogRW5kIG9mIGZpbGUgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaAppbmRleCA1Zjk5M2JkLi4wNjU4MTg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaApAQCAtMzcsMTAgKzM3LDE5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEhJR0hFUl9GUwogZXh0ZXJuIGNvbnN0ICAgIExWTV9VSU5UMTYgIExWTV9Gc1RhYmxlW107CiBleHRlcm4gICAgICAgICAgTFZNX1VJTlQxNiAgTFZNX0dldEZzRnJvbVRhYmxlKExWTV9Gc19lbiBGc0luZGV4KTsKLWV4dGVybiAgICAgICAgICBMVk1fSU5UMzIgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKKyNlbHNlCitleHRlcm4gY29uc3QgICAgTFZNX1VJTlQzMiAgTFZNX0ZzVGFibGVbXTsKK2V4dGVybiAgICAgICAgICBMVk1fVUlOVDMyICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOworI2VuZGlmCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKK2V4dGVybiAgICAgICAgICBMVk1fSU5UMzIgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKKyNlbHNlCitleHRlcm4gICAgICAgICAgTFZNX0ZMT0FUICAgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV07CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCmluZGV4IGE2NzVjYjIuLjIwMzhmYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCkBAIC0yMTYsMTEgKzIxNiwxNyBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBBdWRpb1RpbWUgICAgICAgICAgICAgKTsKKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBBdWRpb1RpbWUgICAgICAgICAgICAgKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldFNwZWN0cnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwppbmRleCBjZDVmNjljLi5mNmM0ZWE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMKQEAgLTI4LDYgKzI4LDE1IEBACiBMVlBTQV9SRVRVUk4gTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKCBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAqcENvZWZmaWNpZW50cyk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICpwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAqcENvZWZmaWNpZW50cyk7CisjZWxzZQogTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAqcENvZWZmaWNpZW50cyk7CkBAIC0zOSw3ICs0OCw3IEBACiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmZmljaWVudHMpOwotCisjZW5kaWYKIExWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CiAKQEAgLTE3OSw3ICsxODgsMTEgQEAKICAgICBMVk1fVUlOVDE2IEZyZXE7CiAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUGFyYW1zOwogICAgIGV4dGVybiBMVk1fSU5UMTYgICAgICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW107CisjaWZuZGVmIEhJR0hFUl9GUwogICAgIGV4dGVybiBMVk1fVUlOVDE2ICAgICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsKKyNlbHNlCisgICAgZXh0ZXJuIExWTV9VSU5UMzIgICAgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOworI2VuZGlmCiAgICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW107CiAKIApAQCAtMjY3LDggKzI4MCwxMSBAQAogTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgKCAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApCiB7Ci0KKyNpZm5kZWYgSElHSEVSX0ZTCiAgICAgZXh0ZXJuIExWTV9VSU5UMTYgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSB0YWJsZSAqLworI2Vsc2UKKyAgICBleHRlcm4gTFZNX1VJTlQzMiAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisjZW5kaWYKICAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICBmcyA9IChMVk1fVUlOVDMyKUxWUFNBX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+RnNdOyAgICAgIC8qIFNhbXBsZSByYXRlICovCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICBmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLwpAQCAtMzQyLDI2ICszNTgsNDIgQEAKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSAgICBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI6CiAgICAgICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CiAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBMVlBTQV9CUERvdWJsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwUGFyYW1zLT5GcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVlBTQV9CUERvdWJsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwUGFyYW1zLT5GcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKIAogICAgICAgICAgICAgICAgIC8qCkBAIC0zNzQsOSArNDA2LDI2IEBACiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAmcEluc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00MDksMTggKzQ1OCwzMSBAQAogewogICAgIExWTV9VSU5UMTYgICAgIGlpOwogICAgIExWTV9Gc19lbiAgICAgIEZzID0gcFBhcmFtcy0+RnM7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgUVBEX0MzMl9Db2VmcyAgKnBDb2VmZmljaWVudHM7CiAgICAgZXh0ZXJuICAgICAgICAgUVBEX0MzMl9Db2VmcyAgICAgTFZQU0FfUVBEX0NvZWZzW107CiAKLQogICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOworI2Vsc2UKKyAgICBRUERfRkxPQVRfQ29lZnMgICpwQ29lZmZpY2llbnRzOworICAgIGV4dGVybiAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW107CisKKyAgICBwQ29lZmZpY2llbnRzID0gJkxWUFNBX1FQRF9GbG9hdF9Db2Vmc1socFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKSArIEZzXTsKKyNlbmRpZgogCiAKICAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKICAgICB7Ci0gICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wUVBEX1RhcHNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZmljaWVudHMgKTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZQU0FfUVBEX0luaXQgKCZwSW5zdC0+cFFQRF9TdGF0ZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wUVBEX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZmaWNpZW50cyApOworI2Vsc2UKKyAgICAgICAgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCZwSW5zdC0+cFFQRF9TdGF0ZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wUVBEX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZmaWNpZW50cyApOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuKExWUFNBX09LKTsKQEAgLTQ2MCw2ICs1MjIsODcgQEAKIC8qICAgICBvZiB0aGUgbiBiYW5kcyBlcXVhbGl6ZXIgKExWRVFOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKQoreworCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfQ29zQ29lZltdOworCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIER0MDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIENPU19UMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICBGcmVxdWVuY3kgICA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7CisgICAgTFZNX0ZMT0FUICAgICAgICAgIFFGYWN0b3IgICAgID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBEID0gMzIwMDsgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCisgICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gIFQwIC8gMjA0OCA7CisgICAgQjJfRGVuID0gUUZhY3RvciArIER0MDsKKyAgICBCMl9OdW0gPSBEdDAgLSBRRmFjdG9yOworICAgIEIyID0gQjJfTnVtIC8gKDIgKiBCMl9EZW4pOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKKyAgICAgKi8KKyAgICBUMCA9IChUMCAvIDIwNDgpICogMC42MzY1ODU1OGY7ICAgICAgICAgICAgICAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzIgKi8KKyAgICB0MCA9IFQwIDsKKyAgICBmYWN0b3IgPSAxLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRvIDEuMCBmb3IgdGhlIGEwIGNvZWZmaWNpZW50ICovCisgICAgQ09TX1QwID0gMC4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciB0byB6ZXJvICovCisgICAgZm9yIChpID0gMTsgaSA8IDc7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgICAgPSBMVlBTQV9GbG9hdF9Db3NDb2VmW2ldOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpOyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KKyAgICAgICAgZmFjdG9yICA9IChmYWN0b3IgKiB0MCkgOyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ09TX1QwID0gQ09TX1QwICogODsgICAgLypMVlBTQV9Db3NDb2VmX2Zsb2F0WzBdKi8gICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKworICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpICogKENPU19UMCk7ICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqIGNvcyh0MCkgKi8KKyAgICBBMCA9ICgoTFZNX0ZMT0FUKTAuNSArIEIyKSAvIDI7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gQTAgKiAyOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjEgKiAyOworICAgIHBDb2VmZmljaWVudHMtPkIyID0gQjIgKiAyOworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICpwQ29lZmZpY2llbnRzKQpAQCAtNTQxLDcgKzY4NCw3IEBACiAKICAgICByZXR1cm4oTFZQU0FfT0spOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU4NCw2ICs3MjcsOTAgQEAKIC8qICAgICBvZiB0aGUgbiBiYW5kcyBlcXVhbGl6ZXIgKExWRVFOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICpwQ29lZmZpY2llbnRzKQoreworCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW107CisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIER0MDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIENvc0VycjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgRnJlcXVlbmN5ICAgPSAoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3kpOworICAgIExWTV9GTE9BVCAgICAgICAgICBRRmFjdG9yICAgICA9ICgoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5RRmFjdG9yKSkgLyAxMDA7CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBEID0gMzIwMDsgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KKyAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKKyAgICAgKi8KKyAgICBEdDAgPSAgVDAgLyAyMDQ4IDsKKyAgICBCMl9EZW4gPSBRRmFjdG9yICsgRHQwOworICAgIEIyX051bSA9IER0MCAtIFFGYWN0b3I7CisgICAgQjIgPSBCMl9OdW0gLyAoMiAqIEIyX0Rlbik7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGVycm9yIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgorICAgICAqCisgICAgICogIENvc0VyciArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNAorICAgICAqLworICAgIFQwID0gVDAgKiAwLjk5NDc1MGY7ICAgICAgICAgICAgICAgICAgICAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzUwICovCisgICAgdDAgPSBUMDsKKyAgICBmYWN0b3IgPSAxLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRvIDEuMCBmb3IgdGhlIGEwIGNvZWZmaWNpZW50ICovCisgICAgQ29zRXJyID0gMC4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciB0byB6ZXJvICovCisgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVlBTQV9GbG9hdF9EUENvc0NvZWZbaV07ICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDb3NFcnIgKz0gZmFjdG9yICogY29lZjsgICAgICAgICAvKiBUaGUgbnRoIHBhcnRpYWwgc3VtICovCisgICAgICAgIGZhY3RvciA9IGZhY3RvciAqIHQwOyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ29zRXJyID0gQ29zRXJyICogMjsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIxIGFuZCBBMCBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBCMSA9ICgoTFZNX0ZMT0FUKTAuNSAtIEIyKTsgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKi8KKyAgICBBMCA9IEIxICogQ29zRXJyIDsgICAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yICgwLjUgLSBiMikgKiBjb3NlcnIodDApICovCisgICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAqLworICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICArIEIyKSAvIDI7ICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IEEwOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjE7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMjsKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisjZWxzZQogTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAqcENvZWZmaWNpZW50cykKQEAgLTY2Niw3ICs4OTMsNyBAQAogCiAgICAgcmV0dXJuKExWUFNBX09LKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OTAsMTEgKzkxNywxNyBAQAogCiAgICAgLyogQmFuZCBQYXNzIGZpbHRlcnMgdGFwcyAqLwogICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQ4ICopcEluc3QtPnBCUF9UYXBzOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCk7IGkrKykKKyAgICB7CisgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKKyAgICB9CisjZWxzZQogICAgIGZvcihpID0gMDsgaSA8IHBJbnN0LT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpOyBpKyspCiAgICAgewogICAgICAgICBwVGFwQWRkcmVzc1tpXSA9IDA7CiAgICAgfQotCisjZW5kaWYKICAgICAvKiBRdWFzaS1wZWFrIGZpbHRlcnMgdGFwcyAqLwogICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQ4ICopcEluc3QtPnBRUERfVGFwczsKICAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpOyBpKyspCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYwppbmRleCAyN2E0YmMzLi4xYzI2ODYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMKQEAgLTQ3LDcgKzQ3LDExIEBACiAgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAgICpwTFZQU0FfSW5zdDsKICAgICBMVlBTQV9SRVRVUk4gICAgICAgICAgICAgICAgZXJyb3JDb2RlICAgICAgID0gTFZQU0FfT0s7CiAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIGlpOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIGV4dGVybiBMVk1fSU5UMTYgICAgICAgICAgICBMVlBTQV9HYWluVGFibGVbXTsKKyNlbHNlCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICAgICAgICAgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdOworI2VuZGlmCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCA9IDA7CiAKICAgICAvKiBJbnRzX0FsbG9jIGluc3RhbmNlcywgbmVlZGVkIGZvciBtZW1vcnkgYWxpZ25tZW50IG1hbmFnZW1lbnQgKi8KQEAgLTE0MSwxOSArMTQ1LDM3IEBACiAKIAogICAgIC8qIEFzc2lnbiB0aGUgcG9pbnRlcnMgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOworI2Vsc2UKKyAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICk7CisjZW5kaWYKICAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoICogc2l6ZW9mKExWTV9VSU5UOCkgKTsKICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSApOwogICAgIHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbikgKTsKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICk7CiAgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkgKTsKKyNlbHNlCisgICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKTsKKyAgICBwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSApOworI2VuZGlmCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfVGFwc190KSApOwogICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCkgKTsKIAorI2Vsc2UKKyAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOworICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUVBEX0ZMT0FUX1RhcHNfdCkgKTsKKyNlbmRpZgogCiAgICAgLyogQ29weSBmaWx0ZXJzIHBhcmFtZXRlcnMgaW4gdGhlIHByaXZhdGUgaW5zdGFuY2UgKi8KICAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCkBAIC0xNjQsNyArMTg2LDEyIEBACiAgICAgLyogU2V0IFBvc3QgZmlsdGVycyBnYWlucyovCiAgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbaWldID0oTFZNX1VJTlQxNikgTFZQU0FfR2FpblRhYmxlW3BJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gKyAxNV07CisjZWxzZQorICAgICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tpaV0gPSBMVlBTQV9GbG9hdF9HYWluVGFibGVbMTUgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW5dOworI2VuZGlmCiAgICAgfQogICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCmluZGV4IDA5ODRiMTAuLjA2YThmOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMKQEAgLTEwNiw3ICsxMDYsMTEgQEAKICAgICAgICAgICovCiAKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSApOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fRkxPQVQpICk7CisjZWxzZQogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQxNikgKTsKKyNlbmRpZgogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKIAogICAgICAgICB7CkBAIC0xMzQsNyArMTM4LDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmU2NyYXRjaCwgMiAqIHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAqIHNpemVvZihMVk1fSU5UMTYpICk7CisjZWxzZQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmU2NyYXRjaCwgMiAqIHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAqIHNpemVvZihMVk1fRkxPQVQpICk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmU2NyYXRjaCk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgPSBMVlBTQV9TQ1JBVENIOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CkBAIC0xNDIsOCArMTUwLDEzIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFBlcnNpc3RlbnQgY29lZmZpY2llbnRzIG1lbW9yeQogICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KSApOworI2Vsc2UKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSApOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQ29lZik7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWUFNBX1BFUlNJU1RFTlRfQ09FRjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CkBAIC0xNTEsOCArMTY0LDEzIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFBlcnNpc3RlbnQgZGF0YSBtZW1vcnkKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfVGFwc190KSApOwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KSApOworI2Vsc2UKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9GTE9BVF9UYXBzX3QpICk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZEYXRhKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9EQVRBOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCmluZGV4IDAzNTIyZmIuLmE3NTBiYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtNDMsOCArNDMsMTEgQEAKICNkZWZpbmUgTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRiAgMSAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGNvZWZmaWNpZW50cyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgKi8KICNkZWZpbmUgTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQSAgMiAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IHRhcHMgIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgKi8KICNkZWZpbmUgTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0ggICAgICAgICAgMyAgICAgIC8qIE9mZnNldCB0byBzY3JhdGNoICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICA5ICAgICAgLyogRnJvbSA4MDAwSHogdG8gNDgwMDBIeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHoqLworI2Vsc2UKKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTEgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCisjZW5kaWYKICNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEICAgICAgICAgMyAgICAgIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogI2RlZmluZSBMVlBTQV9NQVhCVUZGRVJEVVJBVElPTiAgICAgICAgICA0MDAwICAgLyogTWF4aW11bSBsZW5ndGggaW4gbXMgb2YgdGhlIGxldmVscyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTMsMTIgKzk2LDI3IEBACiAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOwogCiAgICAgTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4gKnBCUEZpbHRlcnNQcmVjaXNpb247ICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBmaWx0ZXIgcHJlY2lzaW9uIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgKnBCUF9JbnN0YW5jZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgICAgICovCiAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAgKnBCUF9UYXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAgICAgICAgICovCiAgICAgUVBEX1N0YXRlX3QgICAgICAgICAgICAgICAgKnBRUERfU3RhdGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgICAgICAgICAgICovCiAgICAgUVBEX1RhcHNfdCAgICAgICAgICAgICAgICAgKnBRUERfVGFwczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICovCisjZWxzZQorICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICpwQlBfSW5zdGFuY2VzOworICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAqLworICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICpwQlBfVGFwczsKKyAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgUVBEIGZpbHRlciBpbnN0YW5jZSBmb3IgZWFjaCBiYW5kICovCisgICAgUVBEX0ZMT0FUX1N0YXRlX3QgICAgICAgICAgICAgICAgKnBRUERfU3RhdGVzOworICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAqLworICAgIFFQRF9GTE9BVF9UYXBzX3QgICAgICAgICAgICAgICAgICpwUVBEX1RhcHM7CisjZW5kaWYKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICpwUG9zdEdhaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgcG9zdC1maWx0ZXIgZ2FpbnMgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAqLworI2Vsc2UKKyAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgcG9zdC1maWx0ZXIgZ2FpbnMgZm9yIGVhY2ggYmFuZCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwUG9zdEdhaW5zOworI2VuZGlmCiAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgICAgKnBGaWx0ZXJzUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgb2YgdGhlIGZpbHRlcnMgcGFyYW1ldGVycyBmcm9tIHRoZSBpbnB1dCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKaW5kZXggOWUyOWY2OC4uZWE1Zjc0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jCkBAIC00Myw2ICs0Myw5NiBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBBdWRpb1RpbWUgICAgICAgICAgICApCisKK3sKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaWk7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jOworICAgIGV4dGVybiBMVk1fVUlOVDMyICAgICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKKyAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFdyaXRlX1NhdmU7ICAgICAgICAgLyogUG9zaXRpb24gb2YgdGhlIHdyaXRlIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvY2VzcyAgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDSEVDSyBQQVJBTUVURVJTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcExWUFNBX0lucHV0U2FtcGxlcyA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgfQorICAgIGlmKElucHV0QmxvY2tTaXplID09IDAgfHwgSW5wdXRCbG9ja1NpemUgPiBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICB9CisKKyAgICBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgICBwV3JpdGVfU2F2ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEFQUExZIE5FVyBTRVRUSU5HUyBJRiBORUVERUQKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IDA7CisgICAgICAgIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MoIHBMVlBTQV9JbnN0KTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgUFJPQ0VTUyBTQU1QTEVTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBQdXQgc2FtcGxlcyBpbiByYW5nZSBbLTAuNTswLjVbIGZvciBCUCBmaWx0ZXJzIChzZWUgQmlxdWFkcyBkb2N1bWVudGF0aW9uKSAqLworICAgIENvcHlfRmxvYXQocExWUFNBX0lucHV0U2FtcGxlcywgcFNjcmF0Y2gsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgIFNoaWZ0X1NhdF9GbG9hdCgtMSwgcFNjcmF0Y2gsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6CisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgICggJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCAgICggcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgVVBEQVRFIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGVfU2F2ZSkKKyAgICB7CisgICAgICAgIE1VTDMyeDMySU5UTzMyKChBdWRpb1RpbWUgKyAoTFZNX0lOVDMyKSgoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCoxMDAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKUxWUFNBX1NhbXBsZVJhdGVJbnZUYWJbcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRnNJbnZlcnRTaGlmdCkKKyAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA9IEF1ZGlvVGltZSArIEF1ZGlvVGltZUluYzsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKQEAgLTEzMCw3ICsyMjAsNyBAQAogCiAgICAgcmV0dXJuKExWUFNBX09LKTsKIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCmluZGV4IDgzNmJmZDcuLjk5ZDg0NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKQEAgLTMxLDYgKzMxLDE1IEBACiAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2Vmc1syXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogfVFQRF9TdGF0ZV90LCAqcFFQRF9TdGF0ZV90OwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZWxheTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZnNbMl07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31RUERfRkxPQVRfU3RhdGVfdCwgKnBRUERfRkxPQVRfU3RhdGVfdDsKKyNlbmRpZgorCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiBLUDsgICAgLypzaG91bGQgc3RvcmUgYTAqLwpAQCAtMzgsMTIgKzQ3LDMwIEBACiAKIH0gUVBEX0MzMl9Db2VmcywgKlBRUERfQzMyX0NvZWZzOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCisgICAgTFZNX0ZMT0FUIEtNOyAgICAvKnNob3VsZCBzdG9yZSBiMiovCisKK30gUVBEX0ZMT0FUX0NvZWZzLCAqUFFQRF9GTE9BVF9Db2VmczsKKyNlbmRpZgorCisKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbMV07CiAKIH0gUVBEX1RhcHNfdCwgKnBRUERfVGFwc190OwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbMV07CisKK30gUVBEX0ZMT0FUX1RhcHNfdCwgKnBRUERfRkxPQVRfVGFwc190OworCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYyLDYgKzg5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4KTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0ICggICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5TYW1wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpOworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04MCw4ICsxMTMsMTIgQEAKIHZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIFFQRF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICk7CisjaWZkZWYgQlVJTERfRkxPQVQKIAotCit2b2lkIExWUFNBX1FQRF9Jbml0X0Zsb2F0ICggICBRUERfRkxPQVRfU3RhdGVfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICAgICAgKnBDb2VmICAgICApOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYwppbmRleCA1MGUwYTgwLi4yY2MzMmFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYwpAQCAtNDAsMyArNDAsMTQgQEAKICAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSAgPSBwQ29lZi0+S1A7CiAgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gID0gcENvZWYtPktNOwogfQorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCAgIHBRUERfRkxPQVRfU3RhdGVfdCAgICAgICBwUVBEX1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgICAgICAqcENvZWYgICAgICkKK3sKKyAgICBwUVBEX1N0YXRlLT5wRGVsYXkgID0gcFRhcHMtPlN0b3JhZ2U7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gID0gKChMVk1fRkxPQVQpcENvZWYtPktQKTsKKyAgICBwUVBEX1N0YXRlLT5Db2Vmc1sxXSAgPSAoKExWTV9GTE9BVClwQ29lZi0+S00pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCmluZGV4IDY3MTk3YzEuLmUyMzMxNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCkBAIC0zNSwxMiArMzUsMTYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrKCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVmFsdWUgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgVmFsdWUgICApOwogCi0KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBWYWx1ZSAgICk7CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU0LDYgKzU4LDcgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZQU0FfUVBEX1Byb2Nlc3MgKCAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKQEAgLTE3Myw3ICsxNzgsMTMxIEBACiAgICAgICAgIHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCA9IChMVk1fVUlOVDE2KSgtaWkpOwogICAgIH0KIH0KKyNlbHNlCit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0ICggICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5TYW1wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpCit7CiAKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgUEFSQU1FVEVSUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisgICAgUVBEX0ZMT0FUX1N0YXRlX3QgKnBRUERTdGF0ZSA9ICAoUVBEX0ZMT0FUX1N0YXRlX3QqKSZwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXNbQmFuZEluZGV4XTsKKworICAgIC8qIFBvaW50ZXIgdG8gdGFwcyAqLworICAgIExWTV9GTE9BVCogcERlbGF5ICA9IHBRUERTdGF0ZS0+cERlbGF5OworCisgICAgLyogUGFyYW1ldGVycyBuZWVkZWQgZHVyaW5nIHF1YXNpIHBlYWsgY2FsY3VsYXRpb25zICovCisgICAgTFZNX0ZMT0FUICAgWDA7CisgICAgTFZNX0ZMT0FUICAgdGVtcCx0ZW1wMjsKKyAgICBMVk1fRkxPQVQgICBhY2N1OworICAgIExWTV9GTE9BVCAgIFhnMDsKKyAgICBMVk1fRkxPQVQgICBEMDsKKyAgICBMVk1fRkxPQVQgICBWMCA9IChMVk1fRkxPQVQpKCpwRGVsYXkpOworCisgICAgLyogRmlsdGVyJ3MgY29lZiAqLworICAgIExWTV9GTE9BVCAgIEtwID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMF0pKTsKKyAgICBMVk1fRkxPQVQgICBLbSA9ICgoTFZNX0ZMT0FUKShwUVBEU3RhdGUtPkNvZWZzWzFdKSk7CisKKyAgICBMVk1fSU5UMTYgICBpaSA9IG51bVNhbXBsZXM7CisKKyAgICBMVk1fVUlOVDggICpwV3JpdGUgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlcjsKKyAgICBMVk1fSU5UMzIgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OworICAgIExWTV9VSU5UMTYgIERvd25TYW1wbGluZ0ZhY3RvciA9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdGYWN0b3I7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSU5JVElBTElaQVRJT04KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENvcnJlY3QgdGhlIHBvaW50ZXIgdG8gdGFrZSB0aGUgZmlyc3QgZG93biBzYW1wbGVkIHNpZ25hbCBzYW1wbGUgKi8KKyAgICBwSW5TYW1wcyArPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQ7CisgICAgLyogQ29ycmVjdCBhbHNvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIGlpID0gKExWTV9JTlQxNikoaWkgLSAoTFZNX0lOVDE2KXBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCk7CisKKyAgICB3aGlsZSAoaWkgPiAwKQorICAgIHsKKyAgICAgICAgLyogQXBwbHkgcG9zdCBnYWluICovCisgICAgICAgIC8qIC0gMSB0byBjb21wZW5zYXRlIHNjYWxpbmcgaW4gcHJvY2VzcyBmdW5jdGlvbiovCisgICAgICAgIFgwID0gKCpwSW5TYW1wcykgKiBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tCYW5kSW5kZXhdOworICAgICAgICBwSW5TYW1wcyA9IHBJblNhbXBzICsgRG93blNhbXBsaW5nRmFjdG9yOworCisgICAgICAgIC8qIFNhdHVyYXRlIGFuZCB0YWtlIGFic29sdXRlIHZhbHVlICovCisgICAgICAgIGlmKFgwIDwgMC4wZikKKyAgICAgICAgICAgIFgwID0gLVgwOworICAgICAgICBpZiAoWDAgPiAxLjBmKQorICAgICAgICAgICAgWGcwID0gMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgWGcwID1YMDsKKworCisgICAgICAgIC8qIFF1YXNpIHBlYWsgZmlsdGVyIGNhbGN1bGF0aW9uICovCisgICAgICAgIEQwICA9IFhnMCAtIFYwOworCisgICAgICAgIHRlbXAyID0gRDA7CisKKyAgICAgICAgYWNjdSA9IHRlbXAyICogS3A7CisgICAgICAgIEQwICAgID0gRDAgLyAyLjBmOworICAgICAgICBpZiAoRDAgPCAwLjBmKXsKKyAgICAgICAgICAgIEQwID0gLUQwOworICAgICAgICB9CisKKyAgICAgICAgdGVtcDIgPSBEMDsKKworICAgICAgICB0ZW1wID0gRDAgKiBLbTsKKyAgICAgICAgYWNjdSArPSB0ZW1wICsgWGcwOworCisgICAgICAgIGlmIChhY2N1ID4gMS4wZikKKyAgICAgICAgICAgIGFjY3UgPSAxLjBmOworICAgICAgICBlbHNlIGlmKGFjY3UgPCAwLjBmKQorICAgICAgICAgICAgYWNjdSA9IDAuMGY7CisKKyAgICAgICAgVjAgPSBhY2N1OworCisgICAgICAgIGlmKCgocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlIC0gQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50KSA8IERvd25TYW1wbGluZ0ZhY3RvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQoIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYwKTsKKworICAgICAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50IC09IHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZTsKKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCA9IChMVk1fVUlOVDE2KShudW1TYW1wbGVzIC0gaWkpOworICAgICAgICB9CisgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCArPSBEb3duU2FtcGxpbmdGYWN0b3I7CisKKyAgICAgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIERvd25TYW1wbGluZ0ZhY3Rvcik7CisKKyAgICB9CisKKyAgICAvKiBTdG9yZSBsYXN0IHRhcHMgaW4gbWVtb3J5ICovCisgICAgKnBEZWxheSA9IFYwOworCisgICAgLyogSWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsIHRvIHRoZSBmdW5jdGlvbiBhZnRlciBsYXN0IGJhbmQgcHJvY2Vzc2luZywKKyAgICAgICB1cGRhdGUgdGhlIHBhcmFtZXRlcnMuICovCisgICAgaWYoQmFuZEluZGV4ID09IChwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVycyAtIDEpKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwV3JpdGU7CisgICAgICAgIC8qIEFkanVzdG1lbnQgZm9yIDExMDI1SHogaW5wdXQsIDIyMCw1IGlzIG5vcm1hbGx5CisgICAgICAgICAgIHRoZSBleGFjdCBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgMjBtcy4qLworICAgICAgICBpZigocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIT0gcFdyaXRlKSYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzID09IExWTV9GU18xMTAyNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9PSAyMjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IDIyMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKKyAgICAgICAgcExWUFNBX0luc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudDsKKyAgICAgICAgcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gKExWTV9VSU5UMTYpKC1paSk7CisgICAgfQorfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Xcml0ZVBlYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDksNCArMzM4LDIzIEBACiAgICAgKnBwV3JpdGUgPSBwV3JpdGU7CiAKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICoqcHBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgVmFsdWUgICApCit7CisgICAgTFZNX1VJTlQ4ICpwV3JpdGUgPSAqcHBXcml0ZTsKIAorICAgIC8qIFdyaXRlIHRoZSB2YWx1ZSBhbmQgdXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyICovCisgICAgKihwV3JpdGUgKyBCYW5kSW5kZXgpID0gKExWTV9VSU5UOCkoVmFsdWUgKiAyNTYpOworICAgIHBXcml0ZSArPSBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIGlmIChwV3JpdGUgPT0gKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgKyBwTFZQU0FfSW5zdC0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkpCisgICAgeworICAgICAgICBwV3JpdGUgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OworICAgIH0KKworICAgICpwcFdyaXRlID0gcFdyaXRlOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKaW5kZXggMjFhNWQ4ZC4uMTI4NzUwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwpAQCAtMzQsNiArMzQsNyBAQAogICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCiAgKiBmcmVxdWVuY3kKICAqLworI2lmbmRlZiBISUdIRVJfRlMKIGNvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdID0geyAgIDgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCkBAIC00Myw2ICs0NCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyNlbHNlCitjb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXSA9IHsgICA4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMH07ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsNyArNzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OTQ3OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NzEwOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODY5NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOX07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ3MzkKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjIzNjkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTExODUgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAogCiAKQEAgLTg0LDcgKzEwMywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE5MjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM4NDAgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRG93biBzYW1wbGluZyBmYWN0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAyLDcgKzEyNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgLyogMjQwMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgICAgICAgICAgICAgICAgICAgLyogMzIwMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMn07ICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLworI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2NCAgICAgICAgICAgICAgICAgICAvKiA5NjAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyOCAgICAgICAgICAgICAgICAgIC8qMTkyMDAwIFMvcyAgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjIsOCArMTUxLDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTg4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3ODEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5Mn07ICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMTk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTA5OCAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdID0geyAgMC44MDQyODQ3ZiwgICAgICAvKiA4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODM2MDU0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTM2MTc5NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQwMjE0MjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yOTE3ODc0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY4MTA1MWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIwMTA1NTlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDU5MDg5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTM0MDM3MmYKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDY3MDE4NmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDMzNTA5M2YgICAgLyogMTkya1MvcyAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisjZW5kaWYKIC8qCiAgKiBHYWluIHRhYmxlCiAgKi8KQEAgLTE1OSw2ICsyMTAsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTc2fTsgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdPXsgIDAuMTc3NzM0Mzc1ZiwgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE5OTIxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjIzNjMyODEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTA5NzY1NjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4MTczODI4MWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzE1OTE3OTY4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNTQ0OTIxODdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM5Nzk0OTIxOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDQ2Mjg5MDYyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MDA5NzY1NjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU2MjAxMTcxOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjMwODU5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MDc1MTk1MzFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc5Mzk0NTMxMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxMTEzMjgxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMDAwMDAwMDBmLCAgICAgICAgIC8qIDBkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTIxNTgyMDMxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTg3ODkwNjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQxMjEwOTM3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTg0NDcyNjU2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43Nzc4MzIwMzFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjAwMDAwMDAwMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjM4MjgxMjUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41MTE3MTg3NTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxODM1OTM3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTYyMTA5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDc4NTE1NjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjk4MDk1NzAzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNDY2Nzk2ODc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wMTE3MTg3NTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjY1MjM0Mzc1MGZ9OyAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBDb3NvbmUgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODEsNyArMjY1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI2NzEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM3MzAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk0OTB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE1ICovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW10gPSB7IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMzhmLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwOTg2ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYwMTk3NzVmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDgxNTE0OWYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MjQyMDQyZiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yODk2MjA2Zn07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KKyNlbmRpZgogLyoKICAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSBlcnJvciB3aXRoIHRoZSBlcXVhdGlvbjoKICAqCkBAIC0yMDEsNyArMjkzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDR9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X0RQQ29zQ29lZltdID0gezEuMGYsICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDA4MzExZiwgICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MDYxNzk5OWYsICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTM0MjgxZn07ICAgICAgICAgICAgICAgIC8qIGEzICovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFF1YXNpIHBlYWsgZmlsdGVyIGNvZWZmaWNpZW50cyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIzOSwzICszMzcsNTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTM3NUIyQzYsMHgxRTk0M0JCQ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEyRTFFOTUwLDB4MUUyQTUzMkV9fTsgLyogNDhrUy9zICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTE9XICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNTgzMzMzMjEyODgyM2YsMC4wMDYzMTE1NDkzMzk0NDM0Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzM2ODY2MzM1OTQzMzRmLDAuMDA2NTIyMTY3MDA4MzcwMmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTUVESVVNICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NjgwNzk0MjU5NTMzMjlmLDAuMDQxODc0MjY2Njk1MjMxMmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2MTQxMzA0NjkwMzkwOGYsMC4wNDI1MDkwODIyMzkxMjEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NjgwNzk0MjU5NTMzMjlmLDAuMDQxODc0MjY2Njk1MjMxMmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDcwOTk5NTUzNzk5NjNmLDAuMDQzODcwODU1NTg4NDY1OWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97MHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgIC8qIExWUFNBX1NQRUVEX0hJR0ggICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzQxNTE4Njc5MDc0OTQzMWYsMC4yMjU0NDA5MDI2MzU0NTUxZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MzgxNDUxMjA0NDE5MTM2ZiwwLjIyNzkyMDk2NTI5MTU1OTdmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzQxNTE4Njc5MDc0OTQzMWYsMC4yMjU0NDA5MDI2MzU0NTUxZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzMwOTU4MTM1MzMyOTEyMmYsMC4yMzMxNTY4MjI2MjE4MjI0Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKaW5kZXggMGQ2MjI3NC4uZTc1Njk1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKQEAgLTM3NCwxMiArMzc0LDE3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMKaW5kZXggM2U0OGM3ZS4uMjllM2M5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYwpAQCAtNzAsMTEgKzcwLDE3IEBACiB7CiAKICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVk1fVUlOVDMyICAgICAgICAgIEdhaW47CisgICAgTFZNX0lOVDMyICAgICAgICAgICBDdXJyZW50OworI2Vsc2UKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW47CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50OworI2VuZGlmCiAgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfQnlwYXNzTWl4X3QgKikmcEluc3RhbmNlLT5CeXBhc3NNaXg7CiAgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnQ7CisKIAogCiAgICAgLyoKQEAgLTg1LDcgKzkxLDExIEBACiAgICAgICAgICYmIChwSW5zdGFuY2UtPk1TVGFyZ2V0MSAhPSAweDdGRkYpIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9mZi0+b24gdHJhbnN0aW9uICovCiAgICAgICAgICkKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSBwUGFyYW1zLT5FZmZlY3RMZXZlbDsKKyNlbHNlCisgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSAoKExWTV9GTE9BVClwUGFyYW1zLT5FZmZlY3RMZXZlbCAvIDMyNzY3KTsKKyNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTAyLDIzICsxMTIsNDYgQEAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgcHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogcEluc3RhbmNlLT5UcmFuc2l0aW9uR2Fpbik7CisjZWxzZQorICAgIEdhaW4gPSAgKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKTsKKyNlbmRpZgogCiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQ9MTsKKworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOwogICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwoTFZNX0lOVDMyKShHYWluID4+IDE1KSxDdXJyZW50KTsKICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIChMVk1fRkxPQVQpKEdhaW4pLCBDdXJyZW50KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgorCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogKDB4N0ZGRiAtIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKTsKICAgICBHYWluID0gKExWTV9VSU5UMzIpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiAoR2FpbiA+PiAxNSk7CiAgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOwogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqICgxLjAgLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKTsKKyAgICBHYWluID0gKExWTV9GTE9BVClwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIEdhaW47CisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCAoTFZNX0ZMT0FUKShHYWluKSwgQ3VycmVudCk7CisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisjZW5kaWYKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgPSBoSW5zdGFuY2U7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQ9MTsKQEAgLTEzNCw3ICsxNjcsNyBAQAogICAgICAqIENvcnJlY3QgZ2FpbiBmb3IgdGhlIGVmZmVjdCBsZXZlbAogICAgICAqLwogICAgIHsKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIEdhaW5Db3JyZWN0OwogICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEdhaW4xOwogICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEdhaW4yOwpAQCAtMTcyLDYgKzIwNSw0MyBAQAogICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxHYWluMj4+MTYpOwogICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluQ29ycmVjdDsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluMTsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluMjsKKworICAgICAgICBHYWluMSA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKKyAgICAgICAgR2FpbjIgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7CisgICAgICAgIC8qCisgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgR2FpbkNvcnJlY3QgPSAoTFZNX0ZMT0FUKSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbiAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluRnVsbCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgR2FpbjEgPSAoR2FpbjEgKiBHYWluQ29ycmVjdCk7CisgICAgICAgIEdhaW4yID0gKEdhaW4yICogR2FpbkNvcnJlY3QpOworCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGdhaW4gdmFsdWVzCisgICAgICAgICAqLworICAgICAgICBwQ29uZmlnLT5PdXRwdXRfU2hpZnQgPSBwQ29uZmlnLT5PdXRwdXRfU2hpZnQ7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLEdhaW4xKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxHYWluMik7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwpAQCAtMjA2LDkgKzI3NiwxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFVucHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBVbnByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKIHsKIApAQCAtMjIzLDYgKzI5OSw3IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIEFwcGx5IHRoZSBieXBhc3MgbWl4CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopIHBVbnByb2Nlc3NlZCwKQEAgLTIzNiw2ICszMTMsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiopcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYqKXBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworI2Vsc2UKKyAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopIHBVbnByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IG91dHB1dCBnYWluIGNvcnJlY3Rpb24gc2hpZnQKKyAgICAgICAgICovCisgICAgICAgIFNoaWZ0X1NhdF9GbG9hdCgoTFZNX0lOVDE2KXBDb25maWctPk91dHB1dF9TaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaAppbmRleCBkMWVmNzBhLi5mNjliYTM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCkBAIC00MiwxMiArNDIsMTYgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogTWl4ZXIgc2V0dGluZ3MgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgIE1peGVyX0luc3RhbmNlOyAgICAgICAgICAgICAvKiBNaXhlciBpbnN0YW5jZSAqLworI2Vsc2UKICAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICBNaXhlcl9JbnN0YW5jZTsgICAgICAgICAgICAgLyogTWl4ZXIgaW5zdGFuY2UgKi8KKyNlbmRpZgogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE91dHB1dF9TaGlmdDsgICAgICAgICAgICAgICAvKiBDb3JyZWN0aW5nIGdhaW4gb3V0cHV0IHNoaWZ0ICovCiAKIH0gTFZDU19CeXBhc3NNaXhfdDsKIAotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKiBPdXRwdXQgZ2FpbiB0eXBlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtNTYsOCArNjAsMTUgQEAKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBMb3NzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFVucHJvY0xvc3M7ICAgICAgICAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGxvc3MgKi8KIH0gR2Fpbl90OwotCi0KKyNlbHNlCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIE91dHB1dCBnYWluIHNldHRpbmdzLCBHYWluID0gKExvc3MvMzI3NjgpICogMl5TaGlmdCAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgU2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgc2hpZnRzIHJlcXVpcmVkICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBMb3NzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgVW5wcm9jTG9zczsgICAgICAgICAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggbG9zcyAqLworfSBHYWluX3Q7CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NywxMyArNzgsMTkgQEAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICpwUGFyYW1zKTsKIAotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICp1blByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgIE51bVNhbXBsZXMpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICp1blByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgIE51bVNhbXBsZXMpOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKaW5kZXggY2U2ZDQxMC4uM2JmNmVjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jCkBAIC0xMjAsMTEgKzEyMCwxMyBAQAogICAgICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKIAogICAgICAgICBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwwLDApOwotCi0KKyNlbmRpZgogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgIEdhaW47CiAgICAgICAgICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOwogICAgICAgICAgICAgR2FpbiA9IChMVk1fVUlOVDMyKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIExWTV9NQVhJTlRfMTYpOwpAQCAtMTQwLDcgKzE0MiwyMyBAQAogICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCiAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgIEdhaW47CisgICAgICAgICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOworICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzKTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogKEdhaW4pOwogCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBHYWluID0gKEdhaW4gKiBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbik7CisKKyAgICAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwgMCwgR2Fpbik7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogICAgICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jCmluZGV4IDI1YjBkODYuLmVjNTMxMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMKQEAgLTUzLDcgKzUzLDcyIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQorewogCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgKikmcEluc3RhbmNlLT5FcXVhbGlzZXI7CisgICAgTFZDU19EYXRhX3QgICAgICAgICAqcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAqcENvZWZmaWNpZW50czsKKyAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZzOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgKnBFcXVhbGlzZXJDb2VmVGFibGU7CisKKyAgICBwRGF0YSA9IChMVkNTX0RhdGFfdCAqKSBcCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIC8qCisgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIGNoYW5nZXMgcmUtaW5pdGlhbGlzZSB0aGUgZmlsdGVycworICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgYW5kIGNsZWFyIHRoZSBoaXN0b3J5CisgICAgICAgICAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSArIChwUGFyYW1zLT5TcGVha2VyVHlwZSAqICgxICsgTFZNX0ZTXzQ4MDAwKSkpOworICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCBmaWx0ZXJzICovCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzLkEwID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmcy5BMiA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzLkIxID0gKExWTV9GTE9BVCktcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0ZMT0FUKS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjI7CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KChMVk1fSU5UMTYpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKworICAgICAgICBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnRzLT5FcXVhbGlzZXJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmcyk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIHN3aXRjaChwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uU2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQogewpAQCAtMTEyLDcgKzE3Nyw3IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0VxdWFsaXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMzIsNyArMTk3LDM3IEBACiAvKiAgMS4gIEFsd2F5cyBwcm9jZXNzZXMgaW4gcGxhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKQorewogCisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHM7CisKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGVxdWFsaXNlciBpcyByZXF1aXJlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfRVFVQUxJU0VSU1dJVENIKSAhPSAwKQorICAgIHsKKyAgICAgICAgLyogQXBwbHkgZmlsdGVyIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscyAqLworICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcElucHV0T3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKQpAQCAtMTU3LDQgKzI1Miw0IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKaW5kZXggY2Y5NmY1Yi4uMGU3NTZlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaApAQCAtMzIsOCArMzIsMTEgQEAKIC8qIEVxdWFsaXNlciBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgdm9pZCAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKLQorI2Vsc2UKKyAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLCBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOworI2VuZGlmCiB9IExWQ1NfRXF1YWxpc2VyX3Q7CiAKIApAQCAtNDUsMTIgKzQ4LDE1IEBACiAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKTsKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAqcElucHV0T3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQotCisjZWxzZQorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCmluZGV4IDNlNjQwY2IuLjRmNTIyMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaApAQCAtMjQsNyArMjQsNDYzIEBACiAvKiBUaGUgU3RlcmVvIEVuaGFuY2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCisjZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjc3MjAKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxNTEyNQorI2RlZmluZSBDU19NSURETEVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45MjE4OTkKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MTE0NDEKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM4MDM0NAorI2RlZmluZSBDU19TSURFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjMxMDk3CisjZGVmaW5lIENTX1NJREVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MjI0NzAKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEzMDc1OQorI2RlZmluZSBDU19TSURFXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAorLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjI5NDMgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDgzOAorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjIxNTU5CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjk0MzA1NgorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjU1NzM3MgorI2RlZmluZSBDU19TSURFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzkxNDkwCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNjU4ODEKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg4MDYwOAorI2RlZmluZSBDU19TSURFXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDMyMzk3CisjZGVmaW5lIENTX1NJREVfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIxOTEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjk5MzIKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMC4yMjE0MzYKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMC45NDc2MTYKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjU1ODM5OAorI2RlZmluZSBDU19TSURFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzkyMjExCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNjYxODcKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg5MjU1MAorI2RlZmluZSBDU19TSURFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDMyODU2CisjZGVmaW5lIENTX1NJREVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyMzcxICovCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzA2MzgKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNDIzMgorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMC45NjA1NTAKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDk5Njk1CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNTU1NDMKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE0NDE1MgorI2RlZmluZSBDU19TSURFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDUwNzg4CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDQxMDQKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjA3ODEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIyODc0OQorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjI0MTI4CisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjk3MTI2MgorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDQwMTEyCisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjYxMDk2CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTc5MDE2CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTE2Nzg2CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgyNTA3CisjZGVmaW5lIENTX1NJREVfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxODgyICovCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDM5NQorI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMjYxMTcKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjk3MzU3MworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDE0NzcwCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4NzE4MgorI2RlZmluZSBDU19TSURFXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMjc1ODgKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjI5NjQ4CisjZGVmaW5lIENTX1NJREVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4MjE3NworI2RlZmluZSBDU19TSURFXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDMyMiAqLworI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI4NDAwCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMjUyMTQKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTgwMTI2CisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2NDU3OQorI2RlZmluZSBDU19TSURFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjA3MzU1CisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNTcyMjQKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI3NDIzMQorI2RlZmluZSBDU19TSURFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzEyNDk1CisjZGVmaW5lIENTX1NJREVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYzODM0ICovCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzNTkzCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjMxMjI1CisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTg1NTQ1CisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjg0NTczCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjU4OTEwCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDI1NjYyCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuNTcyMjQ4CisjZGVmaW5lIENTX1NJREVfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNTg4Mzk5CisjZGVmaW5lIENTX1NJREVfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2NDQwMiAqLworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNDQ0NQorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjIzMjI2MQorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjk4NjcxMworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNzI2MDYKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjY2OTUyCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwNTY1NAorI2RlZmluZSBDU19TSURFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMS42MTcxNDEKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNjMwNDA1CisjZGVmaW5lIENTX1NJREVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKyNpZmRlZiBISUdIRVJfRlMKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2NSovCisvKiBoaWdoIHBhc3MgZmlsdGVyIHdpdGggY3V0b2ZmIGZyZXF1ZW5jeSAxMDIuMTggSHoqLworI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNTUzMgorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjIzNDQzMgorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjk5MzMzNAorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLworI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTY3MjcKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAxNjcyNworI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMS43OTMzNzIKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNzk3MjM2CisjZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY4OSovCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI0MTIxOQorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yNDA2NTYKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjk5NjY2MQorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisvKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDg5OTEKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDA4OTkxCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAtMS44OTI1MDkKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjg5MzUyNAorI2RlZmluZSBDU19TSURFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBSZXZlcmIgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmV2ZXJiIGRlbGF5IHNldHRpbmdzIGluIHNhbXBsZXMgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184S0haICAgICAgICAgICAgICAgICAgICAgOTMgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzExS0haICAgICAgICAgICAgICAgICAgIDEyOCAgICAgICAgIC8qIFNhbXBsZSByYXRlIDExa1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzEyS0haICAgICAgICAgICAgICAgICAgIDEzOSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDEya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE2S0haICAgICAgICAgICAgICAgICAgIDE4NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDE2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haICAgICAgICAgICAgICAgICAgIDI1NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDIya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haICAgICAgICAgICAgICAgICAgIDI3OSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDI0a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haICAgICAgICAgICAgICAgICAgIDM3MiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDMya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ0a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLworCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjY3MjcxCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjgxNzkKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgIDAuNjk5NjM4CisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgLTAuNjk5NjM4CisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgLTAuNzQ5MDk2CisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAwLjcwNjkzMQorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAtMC43MDY5MzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjcyODI3MgorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAtMC43MjgyNzIKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgIC0wLjgyMDY3OQorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgMC41MTYzOTYKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAtMC41MTYzOTYKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAtMC41MTg1MTIKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAtMC4yOTA5OTAKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuNDc5NTY1CisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjQ3OTU2NQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuNjM3NzQ1CisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAtMC4xOTg5MTIKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMzgwMzQ5CisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAtMC4zODAzNDkKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTAuOTUwODczCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjA0OTEyNworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yOTczODkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5NzM4OQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMDA0MjMKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU2NTI5CisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yNzg2NjEKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMjc4NjYxCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS4yNTQ5OTMKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjMwMzM0NworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisjaWZkZWYgSElHSEVSX0ZTCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KKy8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xNjAyNDg4CisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjE2MDI0ODgKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjU4NTQxMworI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNTk5Mzc3CisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KKy8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3ODM2OQorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjA4NzgzNjkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS43NzY1NzY0CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNzgwNDA3NgorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworI2VuZGlmCisKKworLyogUmV2ZXJiIEdhaW4gU2V0dGluZ3MgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfREVMQVlHQUlOICAgICAgICAgICAgICAgMC44MDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gZGVsYXkgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX09VVFBVVEdBSU4gICAgICAgICAgICAgIDEuMDAwMDAwICAgICAgICAgLyogQWxnb3JpdGhtIG91dHB1dCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1BST0NHQUlOICAgICAgICAgICAgICAgICAgIDE4NDAzICAgICAgICAgLyogUHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9VTlBST0NHQUlOICAgICAgICAgICAgICAgICAxODQwMyAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOQ09SUkVDVCAgICAgICAgICAgICAxLjAwOTM0MyAgICAgICAgIC8qIERlbGF5IG1peGVyIGdhaW4gY29ycmVjdGlvbiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBFcXVhbGlzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzg0OTcgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzU0ODAgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjI2MzMxMgorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuNjAxNzQ4CisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4yODA2ODEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjQ3NTg2NQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgLTAuNDA4MTU0CisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgIDAuOTQzMzU3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgLTAuNDQ5MzQ1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgLTAuMjA5NTk0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgLTAuNDc1ODY1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgLTAuNDA4MTU0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDI3NzYxIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzY3NDYzICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgMS4xMDExNDUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAwLjEzOTAyMAorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgLTAuODY0NDIzCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgMC4wMjQ1NDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgIC0wLjkwODkzMAorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgMC45NzYwNTgKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgLTAuNjk1MzI2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EyICAgICAgICAgICAgICAgICAgIC0wLjA5MDgwOQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAtMC42MTA1OTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgLTAuMzExMTQ5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDMyNTIxIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcxMDE3ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAxLjI3NjY2MQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAtMS4wMTc1MTkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDQ0MTI4CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgIC0wLjcyOTYxNgorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAtMC4yMDQ1MzIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTAgICAgICAgICAgICAgICAgIDEuMDA3MDk1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgIC0wLjg3MTkxMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgMC4wMjMyMzIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgLTAuNzQ1ODU3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IyICAgICAgICAgICAgICAgIC0wLjE4OTE3MQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAzMTM3OCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MDE2NCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjI4MTYyOQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0xLjA3NTg3MgorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjA0MTM2NQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjcyNTIzOQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgIC0wLjIyNDM1OAorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgIDEuMDgxMDkxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAtMC44NjcxODMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgIC0wLjA3MDI0NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNTE1MTIxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAtMC40MjU4OTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wNDE1NzYgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Nzc3NzkgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDEuMzg4NjA1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgIC0xLjMwNTc5OQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgMC4wMzk5MjIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgLTAuNzE5NDk0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgIC0wLjI0MzI0NQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAxLjI3MjkxMAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgIC0xLjM0MTAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAwLjE2NzQ2MgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgIC0wLjYxNDIxOQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgIC0wLjM0NTM4NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAzNDQ5NSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MjQ5MSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNDA5ODMyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAtMS40NTY1MDYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjE1MTQxMAorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgLTAuODA0MjAxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAtMC4xNjM3ODMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAxLjI5OTE5OAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgLTEuNDUyNDQ3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgMC4yNDA0ODkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjY2OTMwMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgLTAuMjk0OTg0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDQ0NTU5IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzgwMDA2ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuNTYwOTg4CisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTEuODc3NzI0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMzg5NzQxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTA3NDEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgLTAuMDcwNDg5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgMS43ODUwNDkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTEgICAgICAgICAgICAgICAgIC0yLjIzMzQ5NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgIDAuNTI2NDMxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAtMC40NDU5MzkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjUyMjQ0NgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAyMjE3MCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2MzI4OCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAxLjYyMzk5MworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgIC0yLjI3MDc0MworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAwLjY4ODgyOQorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgIC0xLjExNzE5MAorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAwLjEzMDIwOAorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAyLjAyODMxNQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMSAgICAgICAgICAgICAgICAgIC0yLjg4MjQ1OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAwLjkwNDUzNQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgIC0wLjU5MzMwOAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgIC0wLjM4NTgxNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAxODYzNSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2MDY0OCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNjQxMTc3CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAtMi4zNjQ2ODcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjc1OTkxMAorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgLTEuMTY2Nzc0CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC4xNzgwNzQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAyLjA5OTY1NQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgLTMuMDY1MjIwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgMS4wMTA0MTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjYzNDAyMQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiAgICAgICAgICAgICAgICAgLTAuMzQ3MzMyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNzg0NDk3CisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAtMy4wMDE0MzUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgLTEuNDc3ODA0CisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC40ODEzNjkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAyLjc1NzMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgIC00LjY3MjEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAxLjkzMTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjk3MTcxOAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiAgICAgICAgICAgICAgICAgLTAuMDIxMjE2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS44ODk1ODIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAtMy40NTYxNDAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMS41Njk4NjQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS43MDA3OTgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC43MDE4MjQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgIDMuNDI3MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgIC02LjI5MzYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgMi44NzIwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgLTEuMzEwNzQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAwLjMxMzEyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworI2VuZGlmCisKKworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgLyogT3V0cHV0IFNoaWZ0ICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgICAgIDAuODQ3NzczNSAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgbG9zcyAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAgICAwLjIwODc0NjUgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgMC41NjkyMjUgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgIDAuMDc3OTQ0MjUgICAgICAgICAvKiBFWCBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNlbHNlCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTI1OCAqLwogI2RlZmluZSBDU19NSURETEVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjI3NzIwICovCiAjZGVmaW5lIENTX01JRERMRV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC03MDQ5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE1MTI1ICovCkBAIC0zOTQsNSArODUwLDYgQEAKICNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCAqLwogI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAxODYwMCAgICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0IGxvc3MgKi8KICNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgIDUxMDggICAgICAgICAgICAgIC8qIEVYIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLwotCiAjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYwppbmRleCAxOTA0ZTQ2Li5kNGM3NjI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMKQEAgLTk4LDcgKzk4LDEzIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CiAgICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIC8qIElucGxhY2UgcHJvY2Vzc2luZyAqLworICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZDU19TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbHNlCiAgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWQ1NfU0NSQVRDSEJVRkZFUlMqc2l6ZW9mKExWTV9JTlQxNikqcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsgICAgIC8qIElucGxhY2UgcHJvY2Vzc2luZyAqLworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgPSBTY3JhdGNoU2l6ZTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICA9IExWQ1NfU0NSQVRDSDsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtMTkwLDYgKzE5Niw3IEBACiAgICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlICAgICAgICAgICAgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgICAgICAgICAgICA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluICAgICAgICA9IDA7CisKICAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7CiAgICAgLyogVGhlc2UgY3VycmVudCBhbmQgdGFyZ2V0IHZhbHVlcyBhcmUgaW50aWFsaXplZCBhZ2FpbiBpbiBMVkNTX0NvbnRyb2wuYyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKaW5kZXggZjNhZGI4ZC4uYTk3ZTRmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCkBAIC05NSwxMCArOTUsMTcgQEAKIC8qIFZvbHVtZSBjb3JyZWN0aW9uIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KKyAgICBMVk1fRkxPQVQgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLworI2Vsc2UKICAgICBMVk1fSU5UMTYgICBDb21wRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvc3QgQ1MgY29tcHJlc3Npb24gMTAwJSBlZmZlY3QgKi8KICAgICBMVk1fSU5UMTYgICBDb21wTWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvc3QgQ1MgY29tcHJlc3Npb24gMCUgZWZmZWN0ICovCiAgICAgTFZNX0lOVDE2ICAgR2FpbkZ1bGw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDUyBnYWluIGNvcnJlY3QgMTAwJSBlZmZlY3QgKi8KICAgICBMVk1fSU5UMTYgICBHYWluTWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAwJSBlZmZlY3QgKi8KKyNlbmRpZgogfSBMVkNTX1ZvbENvcnJlY3RfdDsKIAogLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCkBAIC0xMTIsOCArMTE5LDEzIEBACiAgICAgLyogUHJpdmF0ZSBwYXJhbWV0ZXJzICovCiAgICAgTFZDU19PdXRwdXREZXZpY2VfZW4gICAgT3V0cHV0RGV2aWNlOyAgICAgICAvKiBTZWxlY3RlZCBvdXRwdXQgZGV2aWNlIHR5cGUgKi8KICAgICBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICBWb2xDb3JyZWN0OyAgICAgICAgIC8qIFZvbHVtZSBjb3JyZWN0aW9uIHNldHRpbmdzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVHJhbnNpdGlvbkdhaW47ICAgICAvKiBUcmFuc2l0aW9uIGdhaW4gKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBDb21wcmVzc0dhaW47ICAgICAgIC8qIExhc3QgdXNlZCBjb21wcmVzc29yIGdhaW4qLworI2Vsc2UKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCisjZW5kaWYKIAogICAgIC8qIFN1Yi1ibG9jayBjb25maWd1cmF0aW9ucyAqLwogICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgIFN0ZXJlb0VuaGFuY2VyOyAgICAgLyogU3RlcmVvIGVuaGFuY2VyIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTEzNCwyNCArMTQ2LDM1IEBACiAvKiBDb2VmZmljaWVudCBTdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOworI2Vsc2UKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOwotCisjZW5kaWYKIH0gTFZDU19Db2VmZmljaWVudF90OwogCiAvKiBEYXRhIFN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190IEVxdWFsaXNlckJpcXVhZFRhcHM7CisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgUmV2ZXJiQmlxdWFkVGFwczsKKyAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBTRUJpcXVhZFRhcHNNaWQ7CisgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgU0VCaXF1YWRUYXBzU2lkZTsKKyNlbHNlCiAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgRXF1YWxpc2VyQmlxdWFkVGFwczsKICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCBSZXZlcmJCaXF1YWRUYXBzOwogICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190IFNFQmlxdWFkVGFwc01pZDsKICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCBTRUJpcXVhZFRhcHNTaWRlOwotCisjZW5kaWYKIH0gTFZDU19EYXRhX3Q7CiAKLQogdm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sgKCAgIHZvaWQqIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKaW5kZXggNWQ5OTQ2MS4uMzk1NmQ0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCkBAIC02Niw3ICs2Niw3NyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3NfQ1MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKQoreworICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbnB1dDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKKyAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CiAKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKKyAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBwcm9jZXNzaW5nIGlzIGlucGxhY2UKKyAgICAgKi8KKyAgICBpZiAocEluRGF0YSA9PSBwT3V0RGF0YSkKKyAgICB7CisgICAgICAgIC8qIFByb2Nlc3NpbmcgaW5wbGFjZSAqLworICAgICAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnVtU2FtcGxlcyk7CisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0LCAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFByb2Nlc3Npbmcgb3V0cGxhY2UgKi8KKyAgICAgICAgcElucHV0ID0gcEluRGF0YTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgorICAgICAqLworICAgIGVyciA9IExWQ1NfU3RlcmVvRW5oYW5jZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSByZXZlcmIgZ2VuZXJhdG9yCisgICAgICovCisgICAgZXJyID0gTFZDU19SZXZlcmJHZW5lcmF0b3IoaEluc3RhbmNlLCAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisgICAgCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSBlcXVhbGlzZXIKKyAgICAgKi8KKyAgICBlcnIgPSBMVkNTX0VxdWFsaXNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGJ5cGFzcyBtaXhlcgorICAgICAqLworICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4ZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcHJvY2Vzc2VkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCAodW5wcm9jZXNzZWQpIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMTMzLDcgKzIwMyw3IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNjAsNyArMjMwLDE3MCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkNTX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbCBDUyBwcm9jZXNzIGZ1bmN0aW9uCisgICAgICAgICAqLworICAgICAgICAgICAgZXJyID0gTFZDU19Qcm9jZXNzX0NTKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKKyAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKKyAgICAgICAgICovCisgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkNTX09OKSYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pKQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fRkxPQVQgR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOworICAgICAgICAgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOworCisgICAgICAgICAgICBDdXJyZW50MSA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluICAqIChDdXJyZW50MSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wRnVsbCAqIChDdXJyZW50MSkpKSk7CisKKyAgICAgICAgICAgIGlmKE51bVNhbXBsZXMgPCBMVkNTX0NPTVBHQUlORlJBTUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTnVtU2FtcGxlcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgR2FpblN0ZXA7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBGaW5hbEdhaW47CisgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBTYW1wbGVUb1Byb2Nlc3MgPSBOdW1TYW1wbGVzOworICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKnBPdXRQdHI7CisKKyAgICAgICAgICAgICAgICAvKiBMYXJnZSBjaGFuZ2VzIGluIEdhaW4gY2FuIGNhdXNlIGNsaWNrcyBpbiBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICBTcGxpdCBkYXRhIGludG8gc21hbGwgYmxvY2tzIGFuZCB1c2UgaW50ZXJwb2xhdGVkIGdhaW4gdmFsdWVzICovCisKKyAgICAgICAgICAgICAgICBHYWluU3RlcCA9IChMVk1fRkxPQVQpKCgoR2Fpbi1wSW5zdGFuY2UtPkNvbXByZXNzR2FpbikgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NPTVBHQUlORlJBTUUpIC8gTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPT0gMCkgJiYgKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluIDwgR2FpbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPiBHYWluKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEZpbmFsR2FpbiA9IEdhaW47CisgICAgICAgICAgICAgICAgR2FpbiA9IHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluOworICAgICAgICAgICAgICAgIHBPdXRQdHIgPSBwT3V0RGF0YTsKKworICAgICAgICAgICAgICAgIHdoaWxlKFNhbXBsZVRvUHJvY2VzcyA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkoR2FpbiArIEdhaW5TdGVwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID4gMCkgJiYgKEZpbmFsR2FpbiA8PSBHYWluKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA8IDApICYmIChGaW5hbEdhaW4gPiBHYWluKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKFNhbXBsZVRvUHJvY2VzcyA+IExWQ1NfQ09NUEdBSU5GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciArPSAoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShTYW1wbGVUb1Byb2Nlc3MgLSBMVkNTX0NPTVBHQUlORlJBTUUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIFNhbXBsZVRvUHJvY2VzcykpOworICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTdG9yZSBnYWluIHZhbHVlKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gR2FpbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZS1pbml0IGJ5cGFzcyBtaXggd2hlbiB0aW1lciBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSAmJgorICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBMVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworCisgICAgICAgICAgICAgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIExWTV9UaW1lciAoICZwSW5zdGFuY2UtPlRpbWVySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTMyMSwxMyArNTU0LDQgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCi0KLQotCi0KLQotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYwppbmRleCBlZTI1N2I4Li4xMDg1MTAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCkBAIC01Nyw3ICs1Nyw5OCBAQAogLyogIDIuICBUaGUgbnVtZXJhdG9yIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlsdGVyIGFyZSBuZWdhdGVkIHRvIGNhdXNlIGFuIGludmVyc2lvbi4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICpwUGFyYW1zKQorewogCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRGVsYXk7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90ICAqcENvbmZpZyAgID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgKikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOworICAgIExWQ1NfRGF0YV90ICAgICAgICAgICAgICpwRGF0YTsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKKyAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgQ29lZmZzOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICpwUmV2ZXJiQ29lZlRhYmxlOworCisKKyAgICBwRGF0YSA9IChMVkNTX0RhdGFfdCAqKSBcCisgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGlmOgorICAgICAqICAtIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZAorICAgICAqICAtIHRoZSBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIKKyAgICAgKi8KKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUgKSAgICAgIC8qIFNhbXBsZSByYXRlIGNoYW5nZSB0ZXN0ICovCisKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBkZWxheQorICAgICAgICAgKi8KKyAgICAgICAgRGVsYXkgPSAoTFZNX1VJTlQxNilMVkNTX1N0ZXJlb0RlbGF5Q1NbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07CisKKworICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgICAgICA9IChMVk1fSU5UMTYpKDIgKiBEZWxheSk7CisgICAgICAgIHBDb25maWctPkRlbGF5T2Zmc2V0ICAgID0gMDsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocENvbmZpZy0+U3RlcmVvU2FtcGxlcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVycworICAgICAgICAgKi8KKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKKyAgICAgICAgcFJldmVyYkNvZWZUYWJsZSA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19SZXZlcmJDb2VmVGFibGVbMF07CisKKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzLkExID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmcy5BMiA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0ZMT0FUKS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmcy5CMiA9IChMVk1fRkxPQVQpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlJldmVyYkJpcXVhZFRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKworICAgICAgICBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnRzLT5SZXZlcmJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmcyk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIHN3aXRjaChwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uU2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBtaXhlcgorICAgICAgICAgKi8KKyAgICAgICAgcENvbmZpZy0+UHJvY0dhaW4gPSAoTFZNX1VJTlQxNikoSEVBRFBIT05FR0FJTlBST0MpOworICAgICAgICBwQ29uZmlnLT5VbnByb2NHYWluICA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOVU5QUk9DKTsKKyAgICB9CisKKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAhPSBwUGFyYW1zLT5SZXZlcmJMZXZlbCkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgIFJldmVyYlBlcmNlbnRhZ2UgPSA4Mzg4NjsgICAgICAvLyAxIFBlcmNlbnQgUmV2ZXJiIGkuZSAxLzEwMCBpbiBRIDIzIGZvcm1hdAorICAgICAgICBSZXZlcmJQZXJjZW50YWdlICo9IHBQYXJhbXMtPlJldmVyYkxldmVsOyAgLy8gQWN0dWFsIFJldmVyYiBMZXZlbCBpbiBRIDIzIGZvcm1hdAorICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCA9ICgoTFZNX0ZMT0FUKShSZXZlcmJQZXJjZW50YWdlPj44KSkgLyAzMjc2Ny4wZjsKKyAgICB9CisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAqcFBhcmFtcykKIHsKQEAgLTE0MCw3ICsyMzEsNyBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19SZXZlcmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTc5LDcgKzI3MCw5MSBAQAogLyogIDIuICBUaGUgR2FpbiBpcyBjb21iaW5lZCB3aXRoIHRoZSBMUEYgYW5kIGluY29ycG9yYXRlZCBpbiB0byB0aGUgY29lZmZpY2llbnRzICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQorewogCisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgICpwQ29uZmlnICAgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudHM7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilcCisgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKilcCisgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBpbiBvdXRwbGFjZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBSZXZlcmIgbm90IHJlcXVpcmVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQorICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIHJldmVyYiBpcyByZXF1aXJlZAorICAgICAqLworICAgIC8qIERpc2FibGUgd2hlbiBDUzRNUyBpbiBzdGVyZW8gbW9kZSAqLworICAgIGlmICgoKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfSEVBRFBIT05FKSB8fCBcCisgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgPT0gTFZDU19FWF9IRUFEUEhPTkVTKSB8fAorICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBMVkNTX1NURVJFTykpICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHZhbGlkYXRpb24gdGVzdGluZyAqLworICAgICAgICAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX1JFVkVSQlNXSVRDSCkgIT0wKSkKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHNjcmF0Y2ggbWVtb3J5IGFuZCBmaWx0ZXIgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGlucHV0IGRhdGEgdG8gdGhlIHNjcmF0Y2ggbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIEZpbHRlciB0aGUgZGF0YQorICAgICAgICAgKi8KKyAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFjaykoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50cy0+UmV2ZXJiQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIE11bHQzc19GbG9hdCggKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPlJldmVyYkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGRlbGF5IG1peAorICAgICAgICAgKi8KKyAgICAgICAgRGVsYXlNaXhfRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+U3RlcmVvU2FtcGxlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+RGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBDb25maWctPkRlbGF5T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTI1Nyw4ICs0MzIsNCBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKaW5kZXggNmUwMjZmZi4uNjk4OTJiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaApAQCAtNTgsMTQgKzU4LDIwIEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIERlbGF5T2Zmc2V0OwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBQcm9jR2FpbjsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVW5wcm9jR2FpbjsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMipMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKLQogICAgIC8qIFJldmVyYiBMZXZlbCAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsKLQogICAgIC8qIEZpbHRlciAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKLQorI2Vsc2UKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWl07CisgICAgLyogUmV2ZXJiIExldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFJldmVyYkxldmVsOworICAgIC8qIEZpbHRlciAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOworI2VuZGlmCiB9IExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3Q7CiAKIApAQCAtNzcsMTIgKzgzLDE3IEBACiAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgKnBQYXJhbXMpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMKaW5kZXggYjliOGIwNS4uMjk5MmMzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMKQEAgLTQ5LDcgKzQ5LDEwMyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKIAorICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudDsKKyAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc01pZDsKKyAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc1NpZGU7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcFNFU2lkZUNvZWZzOworCisKKyAgICBwRGF0YSAgICAgPSAoTFZDU19EYXRhX3QgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIG9yIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB1cGRhdGUgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBiYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUKKyAgICAgICAgICovCisgICAgICAgIC8qIE1pZCBmaWx0ZXIgKi8KKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKKworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmc01pZC5BMCA9IChMVk1fRkxPQVQpIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzTWlkLkExID0gKExWTV9GTE9BVCkgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnNNaWQuQjEgPSAoTFZNX0ZMT0FUKS1MVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQjE7CisKKyAgICAgICAgLyogQ2xlYXIgdGhlIHRhcHMgKi8KKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+U0VCaXF1YWRUYXBzTWlkLCAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+U0VCaXF1YWRUYXBzTWlkKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisKKyAgICAgICAgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNNaWQpOworCisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBpZihMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uU2NhbGUgPT0gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQgID0gRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgIH0KKworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSk7CisgICAgICAgIHBTRVNpZGVDb2VmcyA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19TRVNpZGVDb2VmVGFibGVbMF07CisKKyAgICAgICAgLyogU2lkZSBmaWx0ZXIgKi8KKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnNTaWRlLkEwID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmc1NpZGUuQTEgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzU2lkZS5BMiA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnNTaWRlLkIxID0gKExWTV9GTE9BVCktcFNFU2lkZUNvZWZzW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmc1NpZGUuQjIgPSAoTFZNX0ZMT0FUKS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMjsKKworICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSkgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBTRVNpZGVDb2Vmc1tPZmZzZXRdLlNjYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzU2lkZSk7CisKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKKworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQogewpAQCAtMTM4LDcgKzIzNCw3IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1N0ZXJlb0VuaGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNzcsNyArMjczLDkwIEBACiAvKiAgMS4gIFRoZSBzaWRlIGZpbHRlciBpcyBub3QgdXNlZCBpbiBNb2JpbGUgU3BlYWtlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50OworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKKworICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBTdGVyZW8gRW5oYW5jZXIgaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfU1RFUkVPRU5IQU5DRVNXSVRDSCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IGZyb20gc3RlcmVvIHRvIG1pZGRsZSBhbmQgc2lkZQorICAgICAgICAgKi8KKyAgICAgICAgRnJvbTJpVG9NU19GbG9hdChwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IGZpbHRlciB0byB0aGUgbWlkZGxlIHNpZ25hbAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKQorICAgICAgICB7CisgICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCkoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KilcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClwQ29uZmlnLT5NaWRHYWluLCAgICAgIC8qIEdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyIHRoZSBzaWRlIHNpZ25hbCBvbmx5IGluIHN0ZXJlbyBtb2RlIGZvciBoZWFkcGhvbmVzCisgICAgICAgICAqIGFuZCBpbiBhbGwgbW9kZXMgZm9yIG1vYmlsZSBzcGVha2VycworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVkNTX1NURVJFTykKKyAgICAgICAgeworICAgICAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopKHBTY3JhdGNoICsgTnVtU2FtcGxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSBtaWRkbGUgYW5kIHNpZGUgdG8gc3RlcmVvCisgICAgICAgICAqLworICAgICAgICBNU1RvMmlfU2F0X0Zsb2F0KHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBzdGVyZW8gZW5oYW5jZXIgaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMjU0LDcgKzQzMyw0IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oCmluZGV4IDE1YmM0MDcuLjQxMjVmMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oCkBAIC00MywxOCArNDMsMzEgQEAKIC8qIFN0ZXJlbyBlbmhhbmNlciBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAvKgogICAgICAqIE1pZGRsZSBmaWx0ZXIKICAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19NaWQpKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKLQogICAgIC8qCiAgICAgICogU2lkZSBmaWx0ZXIKICAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCisjZWxzZQorICAgIC8qCisgICAgICogTWlkZGxlIGZpbHRlcgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX01pZCkoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKIAotICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCi0KKyAgICAvKgorICAgICAqIFNpZGUgZmlsdGVyCisgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2tfU2lkZSkoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgIE1pZEdhaW47ICAgICAgICAgICAgLyogTWlkZGxlIGdhaW4gaW4gbW9iaWxlIHNwZWFrZXIgbW9kZSAqLworI2VuZGlmCiB9IExWQ1NfU3RlcmVvRW5oYW5jZXJfdDsKIAogCkBAIC02NywxMiArODAsMTcgQEAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAgKnBQYXJhbXMpOwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQotCisjZWxzZQorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKaW5kZXggOTc0ZGUyMS4uZTE1NGUyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwpAQCAtNzEsNyArNzEsMTkgQEAKICAgICB7Q1NfTUlERExFXzQ4MDAwX0EwLCAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19NSURETEVfNDgwMDBfQTEsCiAgICAgIENTX01JRERMRV80ODAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV80ODAwMF9TQ0FMRX19OworICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfQorI2lmZGVmIEhJR0hFUl9GUworICAgICwKKyAgICB7Q1NfTUlERExFXzk2MDAwX0EwLCAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfOTYwMDBfQTEsCisgICAgIENTX01JRERMRV85NjAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xOTIwMDBfQTAsICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTkyMDAwX0ExLAorICAgICBDU19NSURETEVfMTkyMDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzE5MjAwMF9TQ0FMRX0KKyNlbmRpZgorICAgIH07CiAKIC8qIENvZWZmaWNpZW50IHRhYmxlIGZvciB0aGUgc2lkZSBmaWx0ZXIgKi8KIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19TRVNpZGVDb2VmVGFibGVbXSA9IHsKQEAgLTEzMCw2ICsxNDIsMjEgQEAKICAgICAgQ1NfU0lERV80ODAwMF9CMSwKICAgICAgQ1NfU0lERV80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfNDgwMDBfU0NBTEV9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgICwKKyAgICAge0NTX1NJREVfOTYwMDBfQTAsICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV85NjAwMF9BMSwKKyAgICAgQ1NfU0lERV85NjAwMF9BMiwKKyAgICAgQ1NfU0lERV85NjAwMF9CMSwKKyAgICAgQ1NfU0lERV85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfOTYwMDBfU0NBTEV9LAorICAgICB7Q1NfU0lERV8xOTIwMDBfQTAsICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTkyMDAwX0ExLAorICAgICBDU19TSURFXzE5MjAwMF9BMiwKKyAgICAgQ1NfU0lERV8xOTIwMDBfQjEsCisgICAgIENTX1NJREVfMTkyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xOTIwMDBfU0NBTEV9CisjZW5kaWYKIH07CiAKIApAQCAtMTk1LDYgKzIyMiwyMCBAQAogICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjEsCiAgICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0NTX0VRVUFMSVNFUl85NjAwMF9BMCwgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFfSwKKyNlbmRpZgogCiAgICAgLyogQ29uY2VydCBTb3VuZCBFWCBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCiAgICAge0NTRVhfRVFVQUxJU0VSXzgwMDBfQTAsICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMjUxLDYgKzI5MiwyMSBAQAogICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0NTRVhfRVFVQUxJU0VSXzk2MDAwX0EwLCAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRX0sCisgICAgIHtDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAsICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFfQorI2VuZGlmCiB9OwogCiAKQEAgLTMzNCw2ICszOTAsMjEgQEAKICAgICAgQ1NfUkVWRVJCXzQ4MDAwX0IxLAogICAgICBDU19SRVZFUkJfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfNDgwMDBfU0NBTEV9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtDU19SRVZFUkJfOTYwMDBfQTAsICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfOTYwMDBfQTEsCisgICAgIENTX1JFVkVSQl85NjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzk2MDAwX0IxLAorICAgICBDU19SRVZFUkJfOTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAorICAgICB7Q1NfUkVWRVJCXzE5MjAwMF9BMCwgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLAorICAgICBDU19SRVZFUkJfMTkyMDAwX0EyLAorICAgICBDU19SRVZFUkJfMTkyMDAwX0IxLAorICAgICBDU19SRVZFUkJfMTkyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRX0KKyNlbmRpZgogfTsKIAogCkBAIC0zODUsNiArNDU2LDI0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfVm9sQ29ycmVjdFRhYmxlW10gPSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICB7MC40MzMzNjJmLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9LAorICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0sCisgICAgezEuMDAwMDAwZiwgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLworICAgICAwLjAwMDAwMGYsCisgICAgIDEuMDAwMDI0ZiwKKyAgICAgMS40MTI2NDBmfSwKKyAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9CisjZWxzZQogICAgIHsxNDIwMCwgICAgICAgICAgLyogSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLwogICAgICAwLAogICAgICA0MDk2LApAQCAtNDAxLDYgKzQ5MCw3IEBACiAgICAgIDAsCiAgICAgIDQwOTYsCiAgICAgIDU3ODZ9CisjZW5kaWYKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MTgsOCArNTA4LDI1IEBACiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMzIwMDAgICAgIDMyNzIxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDgwMDAgICAgIDMyNzM3ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzOTYwMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NTExNzAzICovICAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTkyMDAwICAgIDMyNzYzICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5ODc3OTI1ICovICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KKyNlbmRpZgogCi0KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKK2NvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbMTFdID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczEyMDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxNjAwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjIwNTAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczI0MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMzMjAwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ4MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM5NjAwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTkyMDAwCit9OworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbOV0gPSB7TFZDU19WT0xfVENfRnM4MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMjAwMCwKQEAgLTQyOCwxNSArNTM1LDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyNDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMAorfTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbOV0gPSB7ODAwMCwKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKK2NvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzExXSA9IHs4MDAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorCQkJCQkJCQkJCQkgIDEyMDAwLAorCQkJCQkJCQkJCQkgIDE2MDAwLAorCQkJCQkJCQkJCQkgIDIyMDUwLAorCQkJCQkJCQkJCQkgIDI0MDAwLAorCQkJCQkJCQkJCQkgIDMyMDAwLAorCQkJCQkJCQkJCQkgIDQ0MTAwLAorCQkJCQkJCQkJCQkgIDQ4MDAwLAorCQkJCQkJCQkJCQkgIDk2MDAwLAorCQkJCQkJCQkJCQkgIDE5MjAwMAorfTsKKyNlbHNlCitjb25zdCBMVk1fSU5UMTYgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLApAQCAtNDQ0LDUgKzU2Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCmluZGV4IGVmZDMwZmIuLmYxMDZhYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKQEAgLTEwLDcgKzEwLDcgQEAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlCdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAogCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKIAogTE9DQUxfTU9EVUxFOj0gbGliYnVuZGxld3JhcHBlcgpAQCAtNDMsNyArNDMsNyBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogICAgIFJldmVyYi9FZmZlY3RSZXZlcmIuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJyZXZlcmJ3cmFwcGVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCBkZjY1MDFiLi40ZjFmZWQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTE0LDcgKzE0LDkgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KKyNpZm5kZWYgTFZNX0ZMT0FUCit0eXBlZGVmIGZsb2F0IExWTV9GTE9BVDsKKyNlbmRpZgogI2RlZmluZSBMT0dfVEFHICJCdW5kbGUiCiAjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YgKGFycmF5KSAvIHNpemVvZiAoYXJyYXkpWzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMApAQCAtMjcxLDcgKzI3MywxMCBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAgICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAgICAgPSAwOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyICAgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciAgICAgICAgICAgID0gTlVMTDsKKyNlbmRpZgogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CiAgICAgICAgIH0KQEAgLTQzOSw2ICs0NDQsMTQgQEAKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgfQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBkZWxldGUgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IExWTV9OVUxMOwogICAgIH0KQEAgLTY5NSw3ICs3MDgsNDcgQEAKICAgICByZXR1cm4gMDsKIH0gICAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gSU5UMTZMVE9GTE9BVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUb2RvOiBuZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKK3N0YXRpYyB2b2lkIEludDE2VG9GbG9hdChjb25zdCBMVk1fSU5UMTYgKnNyYywgTFZNX0ZMT0FUICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIHNyYyArPSBuLTE7CisgICAgZHN0ICs9IG4tMTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAqZHN0ID0gKChMVk1fRkxPQVQpKChMVk1fSU5UMTYpKnNyYykpIC8gMzI3NjguMGY7CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIEZMT0FUVE9JTlQxNl9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gVG9kbyA6IE5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgorc3RhdGljIHZvaWQgRmxvYXRUb0ludDE2X1NBVChjb25zdCBMVk1fRkxPQVQgKnNyYywgTFZNX0lOVDE2ICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIExWTV9JTlQzMiB0ZW1wOwogCisgICAgc3JjICs9IG4tMTsKKyAgICBkc3QgKz0gbi0xOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSgoKnNyYykgKiAzMjc2OC4wZik7CisgICAgICAgIGlmICh0ZW1wID49IDMyNzY3KSB7CisgICAgICAgICAgICAqZHN0ID0gMzI3Njc7CisgICAgICAgIH0gZWxzZSBpZiAodGVtcCA8PSAtMzI3NjgpIHsKKyAgICAgICAgICAgICpkc3QgPSAtMzI3Njg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOworICAgICAgICB9CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEx2bUJ1bmRsZV9wcm9jZXNzKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzEzLDcgKzc2Niw5OSBAQAogLy8gIHBPdXQ6ICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgQlVJTERfRkxPQVQKK2ludCBMdm1CdW5kbGVfcHJvY2VzcyhMVk1fSU5UMTYgICAgICAgICpwSW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCAgICAqcENvbnRleHQpewogCisKKyAgICAvL0xWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0VG1wOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRCdWZmOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZjsKKworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID0gKExWTV9GTE9BVCAqKW1hbGxvYyhmcmFtZUNvdW50ICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgIH0KKworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9IChMVk1fRkxPQVQgKiltYWxsb2MoZnJhbWVDb3VudCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgfQorCisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IE5VTEwpKSB7CisgICAgICAgIEFMT0dWKCJMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgZmxvYXQgYnVmZmVyJ3MgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBJbnB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXI7CisgICAgcE91dHB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyOworCisgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpeworICAgICAgICBwT3V0VG1wID0gcE91dDsKKyAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ICE9IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9JTlQxNikgKiBGQ0NfMik7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBwT3V0VG1wID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgaW52YWxpZCBhY2Nlc3MgbW9kZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwSW4sIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOworICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgI2VuZGlmCisKKyAgICAvKiBDb252ZXJ0aW5nIGlucHV0IGRhdGEgZnJvbSBmaXhlZCBwb2ludCB0byBmbG9hdCBwb2ludCAqLworICAgIEludDE2VG9GbG9hdChwSW4sIHBJbnB1dEJ1ZmYsIGZyYW1lQ291bnQgKiAyKTsKKworICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVDb3VudCwgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRvIFRpbWUgKi8KKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8qIENvbnZlcnRpbmcgb3V0cHV0IGRhdGEgZnJvbSBmbG9hdCBwb2ludCB0byBmaXhlZCBwb2ludCAqLworICAgIEZsb2F0VG9JbnQxNl9TQVQocE91dHB1dEJ1ZmYsIHBPdXRUbXAsIChMVk1fVUlOVDE2KWZyYW1lQ291bnQgKiAyKTsKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwT3V0VG1wLCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgI2VuZGlmCisKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogMjsgaSsrKXsKKyAgICAgICAgICAgIHBPdXRbaV0gPSBjbGFtcDE2KChMVk1fSU5UMzIpcE91dFtpXSArIChMVk1fSU5UMzIpcE91dFRtcFtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLworI2Vsc2UKIGludCBMdm1CdW5kbGVfcHJvY2VzcyhMVk1fSU5UMTYgICAgICAgICpwSW4sCiAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCkBAIC03NzEsNyArOTE2LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLwotCisjZW5kaWYKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMoKQpAQCAtMTEyNiw2ICsxMjcxLDE2IEBACiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCiAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgOTYwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworI2VuZGlmCiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggZWU2MDRlYi4uY2FkODlmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTEwMyw2ICsxMDMsMTAgQEAKICAgICBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQY21JblB0cjsKICAgICBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQY21PdXRQdHI7CiAgICAgI2VuZGlmCisgICAgI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAqcElucHV0QnVmZmVyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRCdWZmZXI7CisgICAgI2VuZGlmCiB9OwogCiAvKiBTZXNzaW9uQ29udGV4dCA6IE9uZSBzZXNzaW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCAxMmEwMzhmLi5hYjZiNjNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTE0LDcgKzE0LDkgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KKyNpZm5kZWYgTFZNX0ZMT0FUCit0eXBlZGVmIGZsb2F0IExWTV9GTE9BVDsKKyNlbmRpZgogI2RlZmluZSBMT0dfVEFHICJSZXZlcmIiCiAjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YgKGFycmF5KSAvIHNpemVvZiAoYXJyYXkpWzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMApAQCAtMTUyLDYgKzE1NCw4IEBACiAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgKkluRnJhbWVzMzI7CiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAqT3V0RnJhbWVzMzI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplSW47CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplT3V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4aWxpYXJ5OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0OwogICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgY3VyUHJlc2V0OwpAQCAtMTcyLDggKzE3NiwxMSBAQAogCiAjZGVmaW5lIFJFVkVSQl9ERUZBVUxUX1BSRVNFVCBSRVZFUkJfUFJFU0VUX05PTkUKIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgUkVWRVJCX1NFTkRfTEVWRUwgICAwLjc1ZiAvLyAwLjc1IGluIDQuMTIgZm9ybWF0CisjZWxzZQogI2RlZmluZSBSRVZFUkJfU0VORF9MRVZFTCAgICgweDBDMDApIC8vIDAuNzUgaW4gNC4xMiBmb3JtYXQKKyNlbmRpZgogI2RlZmluZSBSRVZFUkJfVU5JVF9WT0xVTUUgICgweDEwMDApIC8vIDEuMCBpbiA0LjEyIGZvcm1hdAogCiAvLy0tLSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCkBAIC0yNjksOCArMjc2LDE1IEBACiAKIAogICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmV2ZXJiIHByb2Nlc3MgKCoyIGlzIGZvciBTVEVSRU8pCi0gICAgcENvbnRleHQtPkluRnJhbWVzMzIgID0gKExWTV9JTlQzMiAqKW1hbGxvYyhMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMik7Ci0gICAgcENvbnRleHQtPk91dEZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMik7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoZmxvYXQpICogMjsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IHBDb250ZXh0LT5idWZmZXJTaXplSW47CisjZWxzZQorICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMjsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IHBDb250ZXh0LT5idWZmZXJTaXplSW47CisjZW5kaWYKKyAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiAgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplSW4pOworICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVPdXQpOwogCiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICV6dSIsIHBDb250ZXh0LCBzaXplb2YoUmV2ZXJiQ29udGV4dCkpOwogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSBlbmRcbiIpOwpAQCAtMjkyLDYgKzMwNiw4IEBACiAgICAgI2VuZGlmCiAgICAgZnJlZShwQ29udGV4dC0+SW5GcmFtZXMzMik7CiAgICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzMzIpOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSAwOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gMDsKICAgICBSZXZlcmJfZnJlZShwQ29udGV4dCk7CiAgICAgZGVsZXRlIHBDb250ZXh0OwogICAgIHJldHVybiAwOwpAQCAtMzg4LDYgKzQwNCw0OCBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIElOVDE2TFRPRkxPQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gVG9kbzogbmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCitzdGF0aWMgdm9pZCBJbnQxNlRvRmxvYXQoY29uc3QgTFZNX0lOVDE2ICpzcmMsIExWTV9GTE9BVCAqZHN0LCBzaXplX3QgbikgeworICAgIHNpemVfdCBpaTsKKyAgICBzcmMgKz0gbi0xOworICAgIGRzdCArPSBuLTE7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgKmRzdCA9ICgoTFZNX0ZMT0FUKSgoTFZNX0lOVDE2KSpzcmMpKSAvIDMyNzY4LjBmOworICAgICAgICBzcmMtLTsKKyAgICAgICAgZHN0LS07CisgICAgfQorICAgIHJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBGTE9BVFRPSU5UMTZfU0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRvZG8gOiBOZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKK3N0YXRpYyB2b2lkIEZsb2F0VG9JbnQxNl9TQVQoY29uc3QgTFZNX0ZMT0FUICpzcmMsIExWTV9JTlQxNiAqZHN0LCBzaXplX3QgbikgeworICAgIHNpemVfdCBpaTsKKyAgICBMVk1fSU5UMzIgdGVtcDsKKworICAgIHNyYyArPSBuLTE7CisgICAgZHN0ICs9IG4tMTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICB0ZW1wID0gKExWTV9JTlQzMikoKCpzcmMpICogMzI3NjguMGYpOworICAgICAgICBpZiAodGVtcCA+PSAzMjc2NykgeworICAgICAgICAgICAgKmRzdCA9IDMyNzY3OworICAgICAgICB9IGVsc2UgaWYgKHRlbXAgPD0gLTMyNzY4KSB7CisgICAgICAgICAgICAqZHN0ID0gLTMyNzY4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBzcmMtLTsKKyAgICAgICAgZHN0LS07CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKIHsKICAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQpAQCAtNDIxLDggKzQ3OSwzMSBAQAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE7CiAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgTFZNX0lOVDE2ICpPdXRGcmFtZXMxNjsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRCdWZmOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZjsKKyNlbmRpZgogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGlmIChwQ29udGV4dC0+SW5GcmFtZXMzMiA9PSBOVUxMIHx8CisgICAgICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluIDwgZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+SW5GcmFtZXMzMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5JbkZyYW1lczMyKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyOworICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVJbik7CisgICAgfQorICAgIGlmIChwQ29udGV4dC0+T3V0RnJhbWVzMzIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPCBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDIpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5PdXRGcmFtZXMzMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5PdXRGcmFtZXMzMik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDI7CisgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVPdXQpOworICAgIH0KKyAgICBwSW5wdXRCdWZmID0gKGZsb2F0ICopcENvbnRleHQtPkluRnJhbWVzMzI7CisgICAgcE91dHB1dEJ1ZmYgPSAoZmxvYXQgKilwQ29udGV4dC0+T3V0RnJhbWVzMzI7CisjZW5kaWYKICAgICAvLyBDaGVjayB0aGF0IHRoZSBpbnB1dCBpcyBlaXRoZXIgbW9ubyBvciBzdGVyZW8KICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMjsKQEAgLTQ0OCw0OSArNTI5LDg0IEBACiAgICAgICAgIFJldmVyYl9Mb2FkUHJlc2V0KHBDb250ZXh0KTsKICAgICB9CiAKLQotCiAgICAgLy8gQ29udmVydCB0byBJbnB1dCAzMiBiaXRzCiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBJbnQxNlRvRmxvYXQocEluLCBwSW5wdXRCdWZmLCBmcmFtZUNvdW50ICogc2FtcGxlc1BlckZyYW1lKTsKKyNlbHNlCiAgICAgICAgIGZvcihpbnQgaT0wOyBpPGZyYW1lQ291bnQqc2FtcGxlc1BlckZyYW1lOyBpKyspewogICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbaV0gPSAoTFZNX0lOVDMyKXBJbltpXTw8ODsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gaW5zZXJ0IHJldmVyYiBpbnB1dCBpcyBhbHdheXMgc3RlcmVvCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMlsyKmldID0gKHBJblsyKmldICogUkVWRVJCX1NFTkRfTEVWRUwpID4+IDQ7IC8vIDw8OCArID4+MTIKICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyWzIqaSsxXSA9IChwSW5bMippKzFdICogUkVWRVJCX1NFTkRfTEVWRUwpID4+IDQ7IC8vIDw8OCArID4+MTIKKyNlbHNlCisgICAgICAgICAgICBwSW5wdXRCdWZmWzIgKiBpXSA9IChMVk1fRkxPQVQpcEluWzIgKiBpXSAqIFJFVkVSQl9TRU5EX0xFVkVMIC8gMzI3NjguMGY7CisgICAgICAgICAgICBwSW5wdXRCdWZmWzIgKiBpICsgMV0gPSAoTFZNX0ZMT0FUKXBJblsyICogaSArIDFdICogUkVWRVJCX1NFTkRfTEVWRUwgLyAzMjc2OC4wZjsKKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQgJiYgcENvbnRleHQtPmN1clByZXNldCA9PSBSRVZFUkJfUFJFU0VUX05PTkUpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBtZW1zZXQocE91dHB1dEJ1ZmYsIDAsIGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIDIpOyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorI2Vsc2UKICAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5PdXRGcmFtZXMzMiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fSU5UMzIpICogMik7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCisjZW5kaWYKICAgICB9IGVsc2UgewogICAgICAgICBpZihwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFICYmIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPiAwKSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIG1lbXNldChwSW5wdXRCdWZmLCAwLCBmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9GTE9BVCkgKiBzYW1wbGVzUGVyRnJhbWUpOworI2Vsc2UKICAgICAgICAgICAgIG1lbXNldChwQ29udGV4dC0+SW5GcmFtZXMzMiwwLGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0lOVDMyKSAqIHNhbXBsZXNQZXJGcmFtZSk7CisjZW5kaWYKICAgICAgICAgICAgIEFMT0dWKCJcdFplcm9pbmcgJWQgc2FtcGxlcyBwZXIgZnJhbWUgYXQgdGhlIGVuZCBvZiBjYWxsIiwgc2FtcGxlc1BlckZyYW1lKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMsIHByb2R1Y2luZyBhIHN0ZXJlbyBvdXRwdXQgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9Qcm9jZXNzKHBDb250ZXh0LT5oSW5zdGFuY2UsICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0QnVmZiwgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRCdWZmLCAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisjZWxzZQogICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9Qcm9jZXNzKHBDb250ZXh0LT5oSW5zdGFuY2UsICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzIsICAgICAvKiBJbnB1dCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIsICAgIC8qIE91dHB1dCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KLSAgICB9CisjZW5kaWYKKyAgICAgICAgfQogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1Byb2Nlc3MiLCAicHJvY2VzcyIpCiAgICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCiAgICAgLy8gQ29udmVydCB0byAxNiBiaXRzCiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBGbG9hdFRvSW50MTZfU0FUKHBPdXRwdXRCdWZmLCBPdXRGcmFtZXMxNiwgKHNpemVfdClmcmFtZUNvdW50ICogMik7CisjZWxzZQogICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmcmFtZUNvdW50KjI7IGkrKykgeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQogICAgICAgICAgICAgT3V0RnJhbWVzMTZbaV0gPSBjbGFtcDE2KHBDb250ZXh0LT5PdXRGcmFtZXMzMltpXT4+OCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmcmFtZUNvdW50KjI7IGkrKykgeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQotICAgICAgICAgICAgT3V0RnJhbWVzMTZbaV0gPSBjbGFtcDE2KChwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpICsgKExWTV9JTlQzMilwSW5baV0pOwotICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogMjsgaSsrKSB7Ly9hbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgICAgICAgICAvL3BPdXRwdXRCdWZmIGFuZCBPdXRGcmFtZXMxNiBwb2ludCB0byB0aGUgc2FtZSBidWZmZXIsIHNvIGJldHRlciB0bworICAgICAgICAgICAgICAgIC8vYWNjdW11bGF0ZSBpbiBwSW5wdXRCdWZmLCB3aGljaCBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBwSW5wdXRCdWZmW2ldID0gcE91dHB1dEJ1ZmZbaV0gKyAoTFZNX0ZMT0FUKXBJbltpXSAvIDMyNzY4LjBmOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICBGbG9hdFRvSW50MTZfU0FUKHBJbnB1dEJ1ZmYsIE91dEZyYW1lczE2LCAoc2l6ZV90KWZyYW1lQ291bnQgKiAyKTsKKyNlbHNlCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmcmFtZUNvdW50KjI7IGkrKykgeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNigocENvbnRleHQtPk91dEZyYW1lczMyW2ldPj44KSArIChMVk1fSU5UMzIpcEluW2ldKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAvLyBhcHBseSB2b2x1bWUgd2l0aCByYW1wIGlmIG5lZWRlZAogICAgICAgICBpZiAoKHBDb250ZXh0LT5sZWZ0Vm9sdW1lICE9IHBDb250ZXh0LT5wcmV2TGVmdFZvbHVtZSB8fAogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSAhPSBwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lKSAmJgpAQCAtNjQzLDYgKzc1OSwxNCBAQAogICAgIGNhc2UgNDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CiAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgOTYwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HVigiXHJSZXZlcmJfc2V0Q29uZmlnIGludmFsaWQgc2FtcGxpbmcgcmF0ZSAlZCIsIHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTAxMCw3ICsxMTM0LDcgQEAKICAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsKCkgQWN0aXZlUGFyYW1zLkxQRkwgJWQsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWw6ICVkLCAiCiAgICAgLy8gICAgICJjb252ZXJ0ZWQgbGV2ZWw6ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsLCBsZXZlbCk7CiAKLSAgICBpZihBY3RpdmVQYXJhbXMuTFBGICE9IGxldmVsKXsKKyAgICBpZigoaW50MTZfdClBY3RpdmVQYXJhbXMuTFBGICE9IGxldmVsKXsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogKGlnbm9yZSBhdCBzdGFydCB1cCkgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCiAgICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwsIGxldmVsKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAppbmRleCBiYmU5N2VlLi5mYjRmZTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKQEAgLTIsNiArMiwxNCBAQAogICAgIG5hbWU6ICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhlYWRlcl9saWJzOlsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKIH0KIAogY2NfbGlicmFyeSB7CkBAIC0zNCw2ICs0Miw3IEBACiAgICAgICAgICJJTWVkaWFDb2RlY0xpc3QuY3BwIiwKICAgICAgICAgIklNZWRpYUNvZGVjU2VydmljZS5jcHAiLAogICAgICAgICAiSU9NWC5jcHAiLAorICAgICAgICAiSU9NWFN0b3JlLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjQnVmZmVyLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjSW5mby5jcHAiLAogICAgICAgICAiTWVkaWFEZWZzLmNwcCIsCkBAIC02OSwxNCArNzgsNiBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsIC8vIGZvciBtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLCAvLyBmb3IgbWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmgKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICBdLAotCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCkBAIC0yMDIsNiArMjAzLDcgQEAKICAgICAgICAgImxpYmljdWkxOG4iLAogICAgICAgICAibGlic29uaXZveCIsCiAgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgIF0sCiAKQEAgLTIxMCwxNSArMjEyLDEwIEBACiAgICAgICAgICJsaWJjX21hbGxvY19kZWJ1Z19iYWNrdHJhY2UiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgIF0sCi0KICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcAppbmRleCAzMDIwMTM2Li45OTBkMjYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApAQCAtMTgsMTUgKzE4LDE1IEBACiAjZGVmaW5lIExPR19UQUcgIkNoYXJhY3RlckVuY29kaW5nRGVjdG9yIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaD4KICNpbmNsdWRlICJDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yVGFibGVzLmgiCiAKLSNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKLSNpbmNsdWRlICJTdHJpbmdBcnJheS5oIgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL1N0cmluZ0FycmF5Lmg+CiAKLSNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKLSNpbmNsdWRlICJ1bmljb2RlL3Vjc2RldC5oIgotI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorI2luY2x1ZGUgPHVuaWNvZGUvdWNudi5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdWNzZGV0Lmg+CisjaW5jbHVkZSA8dW5pY29kZS91c3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODUsNiArODUsOCBAQAogICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgICAgICAgVUNoYXJzZXREZXRlY3RvciAqY3NkID0gdWNzZGV0X29wZW4oJnN0YXR1cyk7CiAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2ggKnVjbTsKKyAgICAgICAgYm9vbCBnb29kbWF0Y2ggPSB0cnVlOworICAgICAgICBpbnQgaGlnaGVzdCA9IDA7CiAKICAgICAgICAgLy8gdHJ5IGNvbWJpbmVkIGRldGVjdGlvbiBvZiBhcnRpc3QvYWxidW0vdGl0bGUgZXRjLgogICAgICAgICBjaGFyIGJ1ZlsxMDI0XTsKQEAgLTExNiw4ICsxMTgsNiBAQAogICAgICAgICAgICAgdWNzZGV0X3NldFRleHQoY3NkLCBidWYsIHN0cmxlbihidWYpLCAmc3RhdHVzKTsKICAgICAgICAgICAgIGludDMyX3QgbWF0Y2hlczsKICAgICAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqKiB1Y21hID0gdWNzZGV0X2RldGVjdEFsbChjc2QsICZtYXRjaGVzLCAmc3RhdHVzKTsKLSAgICAgICAgICAgIGJvb2wgZ29vZG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgIGludCBoaWdoZXN0ID0gMDsKICAgICAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqIGJlc3RDb21iaW5lZE1hdGNoID0gZ2V0UHJlZmVycmVkKGJ1Ziwgc3RybGVuKGJ1ZiksCiAgICAgICAgICAgICAgICAgICAgIHVjbWEsIG1hdGNoZXMsICZnb29kbWF0Y2gsICZoaWdoZXN0KTsKIApAQCAtMTgwLDggKzE4MCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJnZW5yZSIpIHx8CiAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFsYnVtIikgfHwKICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAidGl0bGUiKSkpIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgZW5jb2RpbmcgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjb21iaW5hdGlvbiBvZiBhcnRpc3QvYWxidW0vdGl0bGUgZXRjLgotICAgICAgICAgICAgICAgIGVuYyA9IGNvbWJpbmVkZW5jOworICAgICAgICAgICAgICAgIGlmICghZ29vZG1hdGNoICYmIGhpZ2hlc3QgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgaXQgb25lIG1vcmUgY2hhbmNlIGlmIHRoZXJlIGlzIG5vIGdvb2QgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcnlpbmcgdG8gZGV0ZWN0ICVzIHNlcGFyYXRlbHkiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXRjaGVzOworICAgICAgICAgICAgICAgICAgICBib29sIGdvb2RtYXRjaFNpbmdsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGludCBoaWdoZXN0U2luZ2xlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdWNzZGV0X3NldFRleHQoY3NkLCBzLCBpbnB1dExlbmd0aCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqKiB1Y21hID0gdWNzZGV0X2RldGVjdEFsbChjc2QsICZtYXRjaGVzLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCogYmVzdFNpbmdsZU1hdGNoID0gZ2V0UHJlZmVycmVkKHMsIGlucHV0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbWEsIG1hdGNoZXMsICZnb29kbWF0Y2hTaW5nbGUsICZoaWdoZXN0U2luZ2xlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2RtYXRjaFNpbmdsZSB8fCBoaWdoZXN0U2luZ2xlID4gaGlnaGVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYyA9IHVjc2RldF9nZXROYW1lKGJlc3RTaW5nbGVNYXRjaCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYyA9IGNvbWJpbmVkZW5jOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBlbmNvZGluZyBkZXRlcm1pbmVkIGZyb20gdGhlIGNvbWJpbmF0aW9uIG9mIGFydGlzdC9hbGJ1bS90aXRsZSBldGMuCisgICAgICAgICAgICAgICAgICAgIGVuYyA9IGNvbWJpbmVkZW5jOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGlzUHJpbnRhYmxlQXNjaWkocywgaW5wdXRMZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGVuYyA9ICJVVEYtOCI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCBmMDhmYWJiLi4xOWIwMGYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KQEAgLTExNywxMiArMTE2LDEyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJiBjYXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKICAgICAgICAgQUxPR1YoInNldE1lZGlhQ2FzIik7CiAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oQnBNZWRpYUV4dHJhY3Rvcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYXMpKTsKKyAgICAgICAgZGF0YS53cml0ZUJ5dGVWZWN0b3IoY2FzVG9rZW4pOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRNRURJQUNBUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewpAQCAtMjA2LDE1ICsyMDUsMTQgQEAKICAgICAgICAgICAgIEFMT0dWKCJzZXRNZWRpYUNhcyIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUV4dHJhY3RvciwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBzcDxJQmluZGVyPiBjYXNCaW5kZXI7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkYXRhLnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmY2FzQmluZGVyKTsKKyAgICAgICAgICAgIEhJbnRlcmZhY2VUb2tlbiBjYXNUb2tlbjsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRhdGEucmVhZEJ5dGVWZWN0b3IoJmNhc1Rva2VuKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBjYXMgZnJvbSBwYXJjZWwiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBjYXNUb2tlbiBmcm9tIHBhcmNlbCIpOwogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxJQ2FzPiBjYXMgPSBpbnRlcmZhY2VfY2FzdDxJQ2FzPihjYXNCaW5kZXIpOwogCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRNZWRpYUNhcyhjYXMpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE1lZGlhQ2FzKGNhc1Rva2VuKSk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggNDMxMzBlYi4uYTA3MzA4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCi0jaW5jbHVkZSA8b214LzEuMC9XT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teE5vZGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL0lHcmFwaGljQnVmZmVyU291cmNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9JT01YQnVmZmVyU291cmNlLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVhTdG9yZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YU3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDhmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YU3RvcmUuY3BwCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklPTVhTdG9yZSIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVhTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214U3RvcmUuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2VudW0geworICAgIENPTk5FQ1QgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIExJU1RfU0VSVklDRV9BVFRSSUJVVEVTLAorICAgIEdFVF9OT0RFX1BSRUZJWCwKKyAgICBMSVNUX1JPTEVTLAorICAgIEdFVF9PTVgsCit9OworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBzdGQ6OnZlY3RvcjxUPiA8LT4gUGFyY2VsIGNvbnZlcnNpb24gZnVuY2l0b25zIHRoYXQKKy8vIGRlcGVuZCBvbiB3cml0ZVRvUGFyY2VsKCkgYW5kIHJlYWRUb1BhcmNlbCgpIGZvciBUIDwtPiBQYXJjZWwuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdiwgUGFyY2VsKiBwKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChzdGQ6OnZlY3RvcjxUPiogdiwgY29uc3QgUGFyY2VsJiBwKTsKKworLy8gc3RkOjpzdHJpbmcgPC0+IFBhcmNlbAorCitzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBQYXJjZWwqIHApIHsKKyAgICBpZiAocy5zaXplKCkgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHAtPndyaXRlQnl0ZUFycmF5KAorICAgICAgICAgICAgcy5zaXplKCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHMuY19zdHIoKSkpOworfQorCitzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChzdGQ6OnN0cmluZyogcywgY29uc3QgUGFyY2VsJiBwKSB7CisgICAgaW50MzJfdCBsZW47CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcC5yZWFkSW50MzIoJmxlbik7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0gZWxzZSBpZiAoKGxlbiA8IDApIHx8IChzdGF0aWNfY2FzdDx1aW50NjRfdD4obGVuKSA+IFNJWkVfTUFYKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzLT5yZXNpemUobGVuKTsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gcC5yZWFkKHN0YXRpY19jYXN0PHZvaWQqPigmcy0+ZnJvbnQoKSksIHN0YXRpY19jYXN0PHNpemVfdD4obGVuKSk7Cit9CisKKy8vIElPTVhTdG9yZTo6QXR0cmlidXRlIDwtPiBQYXJjZWwKKworc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBJT01YU3RvcmU6OkF0dHJpYnV0ZSYgYSwgUGFyY2VsKiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChhLmtleSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gd3JpdGVUb1BhcmNlbChhLnZhbHVlLCBwKTsKK30KKworc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoSU9NWFN0b3JlOjpBdHRyaWJ1dGUqIGEsIGNvbnN0IFBhcmNlbCYgcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYoYS0+a2V5KSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwoJihhLT52YWx1ZSksIHApOworfQorCisvLyBJT01YU3RvcmU6Ok5vZGVJbmZvIDwtPiBQYXJjZWwKKworc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBJT01YU3RvcmU6Ok5vZGVJbmZvJiBuLCBQYXJjZWwqIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKG4ubmFtZSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKG4ub3duZXIsIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWwobi5hdHRyaWJ1dGVzLCBwKTsKK30KKworc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoSU9NWFN0b3JlOjpOb2RlSW5mbyogbiwgY29uc3QgUGFyY2VsJiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihuLT5uYW1lKSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKG4tPm93bmVyKSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwoJihuLT5hdHRyaWJ1dGVzKSwgcCk7Cit9CisKKy8vIElPTVhTdG9yZTo6Um9sZUluZm8gPC0+IFBhcmNlbAorCitzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IElPTVhTdG9yZTo6Um9sZUluZm8mIHIsIFBhcmNlbCogcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoci5yb2xlLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoci50eXBlLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHAtPndyaXRlQm9vbChyLmlzRW5jb2Rlcik7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSBwLT53cml0ZUJvb2woci5wcmVmZXJQbGF0Zm9ybU5vZGVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiB3cml0ZVRvUGFyY2VsKHIubm9kZXMsIHApOworfQorCitzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChJT01YU3RvcmU6OlJvbGVJbmZvKiByLCBjb25zdCBQYXJjZWwmIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKHItPnJvbGUpLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYoci0+dHlwZSksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gcC5yZWFkQm9vbCgmKHItPmlzRW5jb2RlcikpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gcC5yZWFkQm9vbCgmKHItPnByZWZlclBsYXRmb3JtTm9kZXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiByZWFkRnJvbVBhcmNlbCgmKHItPm5vZGVzKSwgcCk7Cit9CisKKy8vIHN0ZDo6dmVjdG9yPE5vZGVJbmZvPiA8LT4gUGFyY2VsCisvLyBzdGQ6OnZlY3RvcjxSb2xlSW5mbz4gPC0+IFBhcmNlbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHYsIFBhcmNlbCogcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHAtPndyaXRlVmVjdG9yU2l6ZSh2KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGZvciAoY29uc3QgVCYgeCA6IHYpIHsKKyAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbCh4LCBwKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoc3RkOjp2ZWN0b3I8VD4qIHYsIGNvbnN0IFBhcmNlbCYgcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHAucmVzaXplT3V0VmVjdG9yKHYpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZm9yIChUJiB4IDogKnYpIHsKKyAgICAgICAgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJngsIHApOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBCcE9NWFN0b3JlIDogcHVibGljIEJwSW50ZXJmYWNlPElPTVhTdG9yZT4geworcHVibGljOgorICAgIGV4cGxpY2l0IEJwT01YU3RvcmUoY29uc3Qgc3A8SUJpbmRlcj4gJmltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SU9NWFN0b3JlPihpbXBsKSB7CisgICAgfQorCisgICAgc3RhdHVzX3QgbGlzdFNlcnZpY2VBdHRyaWJ1dGVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiogYXR0cmlidXRlcykgb3ZlcnJpZGUgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhTdG9yZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9TRVJWSUNFX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKGF0dHJpYnV0ZXMsIHJlcGx5KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXROb2RlUHJlZml4KHN0ZDo6c3RyaW5nKiBwcmVmaXgpIG92ZXJyaWRlIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YU3RvcmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9OT0RFX1BSRUZJWCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwocHJlZml4LCByZXBseSk7CisgICAgfQorCisgICAgc3RhdHVzX3QgbGlzdFJvbGVzKHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiogcm9sZUxpc3QpIG92ZXJyaWRlIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YU3RvcmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfUk9MRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKHJvbGVMaXN0LCByZXBseSk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0T214KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzcDxJT01YPiogb214KSBvdmVycmlkZSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWFN0b3JlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwobmFtZSwgJmRhdGEpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT01YLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkU3Ryb25nQmluZGVyKG9teCk7CisgICAgfQorCit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoT01YU3RvcmUsICJhbmRyb2lkLmhhcmR3YXJlLklPTVhTdG9yZSIpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIENIRUNLX09NWF9JTlRFUkZBQ0UoaW50ZXJmYWNlLCBkYXRhLCByZXBseSkgXAorICAgICAgICBkbyB7IGlmICghKGRhdGEpLmVuZm9yY2VJbnRlcmZhY2UoaW50ZXJmYWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpKSB7IFwKKyAgICAgICAgICAgIEFMT0dXKCJDYWxsIGluY29ycmVjdGx5IHJvdXRlZCB0byAiICNpbnRlcmZhY2UpOyBcCisgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7IFwKKyAgICAgICAgfSB9IHdoaWxlICgwKQorCitzdGF0dXNfdCBCbk9NWFN0b3JlOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSBMSVNUX1NFUlZJQ0VfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YU3RvcmUsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlczsKKworICAgICAgICAgICAgc3RhdHVzID0gbGlzdFNlcnZpY2VBdHRyaWJ1dGVzKCZhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibGlzdFNlcnZpY2VBdHRyaWJ1dGVzKCkgZmFpbHMgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKGF0dHJpYnV0ZXMsIHJlcGx5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibGlzdFNlcnZpY2VBdHRyaWJ1dGVzKCkgZmFpbHMgdG8gc2VuZCByZXBseSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9OT0RFX1BSRUZJWDogeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YU3RvcmUsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeDsKKworICAgICAgICAgICAgc3RhdHVzID0gZ2V0Tm9kZVByZWZpeCgmcHJlZml4KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0Tm9kZVByZWZpeCgpIGZhaWxzIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChwcmVmaXgsIHJlcGx5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0Tm9kZVByZWZpeCgpIGZhaWxzIHRvIHNlbmQgcmVwbHkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBMSVNUX1JPTEVTOiB7CisgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVhTdG9yZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Um9sZUluZm8+IHJvbGVMaXN0OworCisgICAgICAgICAgICBzdGF0dXMgPSBsaXN0Um9sZXMoJnJvbGVMaXN0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibGlzdFJvbGVzKCkgZmFpbHMgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHJvbGVMaXN0LCByZXBseSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImxpc3RSb2xlcygpIGZhaWxzIHRvIHNlbmQgcmVwbHkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfT01YOiB7CisgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVhTdG9yZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgICAgIHNwPElPTVg+IG9teDsKKworICAgICAgICAgICAgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJm5hbWUsIGRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPbXgoKSBmYWlscyB0byByZXRyaWV2ZSBuYW1lIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gZ2V0T214KG5hbWUsICZvbXgpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPbXgoKSBmYWlscyB3aXRoIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihvbXgpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T214KCkgZmFpbHMgdG8gc2VuZCByZXBseSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggOTVmN2QyZS4uOTcyNGZjMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMTksNyArMTksNyBAQAogI2RlZmluZSBMT0dfVEFHICJJUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIm1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCisjaW5jbHVkZSA8bWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKaW5kZXggOWY4MDNjYi4uMDI4NjE2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KIAotI2luY2x1ZGUgIkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaCIKLSNpbmNsdWRlICJTdHJpbmdBcnJheS5oIgorI2luY2x1ZGUgPG1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9TdHJpbmdBcnJheS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlEZXZpY2VJbmZvLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlEZXZpY2VJbmZvLmNwcAppbmRleCAwMmVmYzVmLi43NTg4ZTAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NaWRpRGV2aWNlSW5mby5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaURldmljZUluZm8uY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTWlkaURldmljZUluZm8iCiAKLSNpbmNsdWRlICJNaWRpRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgPG1lZGlhL01pZGlEZXZpY2VJbmZvLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcAppbmRleCBmYWFlOTU0Li40ZTVkNjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KIAotI2luY2x1ZGUgIm1lZGlhL01pZGlJb1dyYXBwZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+CiAKIHN0YXRpYyBpbnQgcmVhZEF0KHZvaWQgKmhhbmRsZSwgdm9pZCAqYnVmZmVyLCBpbnQgcG9zLCBpbnQgc2l6ZSkgewogICAgIHJldHVybiAoKGFuZHJvaWQ6Ok1pZGlJb1dyYXBwZXIqKWhhbmRsZSktPnJlYWRBdChidWZmZXIsIHBvcywgc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5jcHAgYi9tZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5jcHAKaW5kZXggYjJlNTkwNy4uNzg2OGI4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvU3RyaW5nQXJyYXkuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jaW5jbHVkZSAiU3RyaW5nQXJyYXkuaCIKKyNpbmNsdWRlIDxtZWRpYS9TdHJpbmdBcnJheS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCmluZGV4IGUwMzE3NjUuLjVkMjVlNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaApAQCAtMzksNiArMzksMTEgQEAKIAogc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7CiAKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnIpIHsKKyAgICBpZiAobC5zaXplKCkgIT0gci5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gbWVtY21wKGwuYXJyYXkoKSwgci5hcnJheSgpLCBsLnNpemUoKSkgPT0gMDsKK30KKwogc3RydWN0IERybUhhbCA6IHB1YmxpYyBCbkRybSwKICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCiAgICAgICAgICAgICAgcHVibGljIElEcm1QbHVnaW5MaXN0ZW5lciB7CkBAIC0xNjEsNiArMTY2LDkgQEAKICAgICBjb25zdCBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtRmFjdG9yaWVzOwogICAgIHNwPElEcm1QbHVnaW4+IG1QbHVnaW47CiAKKyAgICBWZWN0b3I8VmVjdG9yPHVpbnQ4X3Q+PiBtT3BlblNlc3Npb25zOworICAgIHZvaWQgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKKwogICAgIC8qKgogICAgICAqIG1Jbml0Q2hlY2sgaXM6CiAgICAgICogICBOT19JTklUIGlmIGEgcGx1Z2luIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0CkBAIC0xNzUsNiArMTgzLDExIEBACiAKICAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgYXJyYXkpOwogCisgICAgdm9pZCByZXBvcnRNZXRyaWNzKCkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3Q7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1IYWwpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggYWI0MGY1My4uMWUxM2I2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCkBAIC0yMCwxNCArMjAsMTIgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTWV0YURhdGE7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLX07Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEhJbnRlcmZhY2VUb2tlbjsKIAogY2xhc3MgSU1lZGlhRXh0cmFjdG9yIDogcHVibGljIElJbnRlcmZhY2UgewogcHVibGljOgpAQCAtNjUsNyArNjMsNyBAQAogICAgIC8vIGZvciBEUk0KICAgICB2aXJ0dWFsIGNoYXIqIGdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pICA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgdWlkKSAgPSAwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVguaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCmluZGV4IDlhMGFkYTEuLmQ4Njg4NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCkBAIC0yOSw4ICsyOSw4IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CiAKLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotI2luY2x1ZGUgPE9NWF9WaWRlby5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWFN0b3JlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVhTdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzljM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVhTdG9yZS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSU9NWFNUT1JFX0hfCisKKyNkZWZpbmUgQU5EUk9JRF9JT01YU1RPUkVfSF8KKworI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teFN0b3JlLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCisvKgorI2luY2x1ZGUgPE9NWF9Db3JlLmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvLmg+CisqLworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpJT214U3RvcmU7CisKK2NsYXNzIElPTVhTdG9yZSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE9NWFN0b3JlKTsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGUgeworICAgICAgICBzdGQ6OnN0cmluZyBrZXk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlOworICAgIH07CisKKyAgICBzdHJ1Y3QgTm9kZUluZm8geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBvd25lcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVzOworICAgIH07CisKKyAgICBzdHJ1Y3QgUm9sZUluZm8geworICAgICAgICBzdGQ6OnN0cmluZyByb2xlOworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlOworICAgICAgICBib29sIGlzRW5jb2RlcjsKKyAgICAgICAgYm9vbCBwcmVmZXJQbGF0Zm9ybU5vZGVzOworICAgICAgICBzdGQ6OnZlY3RvcjxOb2RlSW5mbz4gbm9kZXM7CisgICAgfTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdFNlcnZpY2VBdHRyaWJ1dGVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiogYXR0cmlidXRlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROb2RlUHJlZml4KHN0ZDo6c3RyaW5nKiBwcmVmaXgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdFJvbGVzKHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiogcm9sZUxpc3QpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T214KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzcDxJT01YPiogb214KSA9IDA7Cit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIEJuT01YU3RvcmUgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU9NWFN0b3JlPiB7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9JT01YX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNWEzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQTFVHSU5fTUVUUklDU19SRVBPUlRJTkdfSF8KKworI2RlZmluZSBQTFVHSU5fTUVUUklDU19SRVBPUlRJTkdfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCByZXBvcnREcm1QbHVnaW5NZXRyaWNzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2VyaWFsaXplZE1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHZlbmRvck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGRlc2NyaXB0aW9uKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBQTFVHSU5fTUVUUklDU19SRVBPUlRJTkdfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL29teC8xLjAvV09teC5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCmluZGV4IDg2MzIyZGEuLjA4NmY2NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+Ci0jaW5jbHVkZSA8T01YRmVuY2VQYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8bWVkaWEvT01YRmVuY2VQYXJjZWxhYmxlLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teEJ1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvQm5PTVhCdWZmZXJTb3VyY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAppbmRleCAwYTlmNzkxLi42ZGExZWMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcApAQCAtMjQ1LDggKzI0NSwxMiBAQAogICAgIGlmIChzSW5pdENvbXBsZXRlKQogICAgICAgICByZXR1cm47CiAKLSAgICByZWdpc3RlckZhY3RvcnlfbChuZXcgTnVQbGF5ZXJGYWN0b3J5KCksIE5VX1BMQVlFUik7Ci0gICAgcmVnaXN0ZXJGYWN0b3J5X2wobmV3IFRlc3RQbGF5ZXJGYWN0b3J5KCksIFRFU1RfUExBWUVSKTsKKyAgICBJRmFjdG9yeSogZmFjdG9yeSA9IG5ldyBOdVBsYXllckZhY3RvcnkoKTsKKyAgICBpZiAocmVnaXN0ZXJGYWN0b3J5X2woZmFjdG9yeSwgTlVfUExBWUVSKSAhPSBPSykKKyAgICAgICAgZGVsZXRlIGZhY3Rvcnk7CisgICAgZmFjdG9yeSA9IG5ldyBUZXN0UGxheWVyRmFjdG9yeSgpOworICAgIGlmIChyZWdpc3RlckZhY3RvcnlfbChmYWN0b3J5LCBURVNUX1BMQVlFUikgIT0gT0spCisgICAgICAgIGRlbGV0ZSBmYWN0b3J5OwogCiAgICAgc0luaXRDb21wbGV0ZSA9IHRydWU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDk0MmE4ZmMuLjQ5NmRiMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC03Nyw3ICs3Nyw3IEBACiAjaW5jbHVkZSAiVGVzdFBsYXllclN0dWIuaCIKICNpbmNsdWRlICJudXBsYXllci9OdVBsYXllckRyaXZlci5oIgogCi0jaW5jbHVkZSA8T01YLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oPgogCiAjaW5jbHVkZSAiSERDUC5oIgogI2luY2x1ZGUgIkhUVFBCYXNlLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCA2YTA5MjI3Li5kZjM2MDQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTExNzEsNyArMTE3MSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyRXJyb3IgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVN1cmZhY2UgPT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IGF1ZGlvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOwpAQCAtMTE4Miw3ICsxMTgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSB2aWRlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IGFkNzg4ZjcuLjBmYzFhYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtNjM5LDExICs2MzksNiBAQAogICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NUT1BQRUQpOwogICAgIH0KIAotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgewotICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7Ci0gICAgICAgIGR1bXAoLTEsIGFyZ3MpOwotICAgIH0KLQogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKIApAQCAtOTM1LDcgKzkzMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZW5kIGNvbXBsZXRpb24gZXZlbnQgd2hlbiBsb29waW5nCiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgICAgICAgICAgICAgICAgICBkdW1wKC0xLCBhcmdzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggNzU4ZGIxZi4uNDgzYTlmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtODQwLDcgKzg0MCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgbm90aWZ5RU9TX2wodHJ1ZSAvKiBhdWRpbyAqLywgRVJST1JfRU5EX09GX1NUUkVBTSk7CiB9CiAKIHNpemVfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmZpbGxBdWRpb0J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKSB7CkBAIC05MTcsMTAgKzkxNywxMCBAQAogICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmstPm5lZWRzVHJhaWxpbmdQYWRkaW5nKCkpIHsKICAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKEFMb29wZXI6OkdldE5vd1VzKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImZpbGxBdWRpb0J1ZmZlcjogbm90aWZ5RU9TICIKKyAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IG5vdGlmeUVPU19sICIKICAgICAgICAgICAgICAgICAgICAgIm1OdW1GcmFtZXNXcml0dGVuOiV1ICBmaW5hbFJlc3VsdDolZCAgcG9zdEVPU0RlbGF5OiVsbGQiLAogICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiwgZW50cnktPm1GaW5hbFJlc3VsdCwgKGxvbmcgbG9uZylwb3N0RU9TRGVsYXlVcyk7Ci0gICAgICAgICAgICBub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgZW50cnktPm1GaW5hbFJlc3VsdCwgcG9zdEVPU0RlbGF5VXMpOworICAgICAgICAgICAgbm90aWZ5RU9TX2wodHJ1ZSAvKiBhdWRpbyAqLywgZW50cnktPm1GaW5hbFJlc3VsdCwgcG9zdEVPU0RlbGF5VXMpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzaXplQ29waWVkOwpAQCAtMTQwOCw2ICsxNDA4LDExIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbm90aWZ5RU9TX2woYXVkaW8sIGZpbmFsUmVzdWx0LCBkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUVPU19sKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKICAgICBpZiAoYXVkaW8gJiYgZGVsYXlVcyA+IDApIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPUywgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvRU9TR2VuZXJhdGlvbiIsIG1BdWRpb0VPU0dlbmVyYXRpb24pOwpAQCAtMTQyMCw2ICsxNDI1LDExIEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOwogICAgIG5vdGlmeS0+cG9zdChkZWxheVVzKTsKKworICAgIGlmIChhdWRpbykgeworICAgICAgICAvLyBWaWRlbyBtaWdodCBvdXRsaXZlIGF1ZGlvLiBDbGVhciBhbmNob3IgdG8gZW5hYmxlIHZpZGVvIG9ubHkgY2FzZS4KKyAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gLTE7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5QXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKaW5kZXggZTY4NTBiNS4uZjU4Yjc5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCkBAIC0yNzUsNiArMjc1LDcgQEAKICAgICB2b2lkIG9uQ2hhbmdlQXVkaW9Gb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CiAKICAgICB2b2lkIG5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CisgICAgdm9pZCBub3RpZnlFT1NfbChib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CiAgICAgdm9pZCBub3RpZnlGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8pOwogICAgIHZvaWQgbm90aWZ5UG9zaXRpb24oKTsKICAgICB2b2lkIG5vdGlmeVZpZGVvTGF0ZUJ5KGludDY0X3QgbGF0ZUJ5VXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKaW5kZXggZjUxMTg3Ni4uNDIyMGI3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCkBAIC0xLDE1ICsxLDUxIEBACisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibmJhaW9fbW9ub19kZWZhdWx0cyIsCisgICAgc3JjczogWworICAgICAgICAiTW9ub1BpcGUuY3BwIiwKKyAgICAgICAgIk1vbm9QaXBlUmVhZGVyLmNwcCIsCisgICAgICAgICJOQkFJTy5jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGVfbW9ubyJdLAorfQorCisvLyBsaWJuYmFpb19tb25vIGlzIHRoZSBwYXJ0IG9mIGxpYm5iYWlvIHRoYXQgaXMgYXZhaWxhYmxlIGZvciB2ZW5kb3JzIHRvIHVzZS4gVmVuZG9yIG1vZHVsZXMgY2FuJ3QKKy8vIGxpbmsgYWdhaW5zdCBsaWJuYmFpbyBhbmQgc3lzdGVtIG1vZHVsZXMgY2FuJ3QgbGluayBhZ2FpbnN0IGxpYm5iYWlvX21vbm8uIFRoZSByZXN0IG9mIGxpYm5iYWlvCisvLyBwdWxscyBpbiB0b28gbWFueSBvdGhlciBkZXBlbmRlbmNpZXMuCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm5iYWlvX21vbm8iLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJsaWJuYmFpb19tb25vX2RlZmF1bHRzIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibmJhaW8iLAorICAgIGRlZmF1bHRzOiBbImxpYm5iYWlvX21vbm9fZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbCiAgICAgICAgICJBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcCIsCiAgICAgICAgICJBdWRpb1N0cmVhbUluU291cmNlLmNwcCIsCiAgICAgICAgICJBdWRpb1N0cmVhbU91dFNpbmsuY3BwIiwKLSAgICAgICAgIk1vbm9QaXBlLmNwcCIsCi0gICAgICAgICJNb25vUGlwZVJlYWRlci5jcHAiLAotICAgICAgICAiTkJBSU8uY3BwIiwKICAgICAgICAgIk5CTG9nLmNwcCIsCisgICAgICAgICJQZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCIsCiAgICAgICAgICJQaXBlLmNwcCIsCiAgICAgICAgICJQaXBlUmVhZGVyLmNwcCIsCisgICAgICAgICJSZXBvcnRQZXJmb3JtYW5jZS5jcHAiLAogICAgICAgICAiU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAiLAogICAgIF0sCiAKQEAgLTI0LDggKzYwLDggQEAKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTM1LDcgKzcxLDUgQEAKIAogICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKaW5kZXggY2JmZjg3ZC4uODU2NDg5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oPgogCkBAIC04Miw4ICs4Myw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHBvc2l0aW9uNjQ7Ci0gICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQotICAgICAgICAgICAgdGltZS50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyB0aW1lLnR2X25zZWM7CisgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lKTsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAppbmRleCBlYmI5MGM4Li4yZjYzOWQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCkBAIC0xOCwxNCArMTgsMTQgQEAKICogRG9jdW1lbnRhdGlvbjogV29ya2Zsb3cgc3VtbWFyeSBmb3IgaGlzdG9ncmFtIGRhdGEgcHJvY2Vzc2luZzoKICogRm9yIG1vcmUgZGV0YWlscyBvbiBGSUZPLCBwbGVhc2Ugc2VlIHN5c3RlbS9tZWRpYS9hdWRpb191dGlsczsgZG94eWdlbgogKiBUT0RPOiBhZGQgdGhpcyBkb2N1bWVudGF0aW9uIHRvIGRveHlnZW4gb25jZSBpdCBpcyBmdXJ0aGVyIGRldmVsb3BlZAotKiAxKSB3cml0aW5nIHRoZSBkYXRhIHRvIGEgYnVmZmVyCi0qIG9uV29yaworKiAxKSBXcml0aW5nIGJ1ZmZlciBwZXJpb2QgdGltZXN0YW1wIHRvIHRoZSBjaXJjdWxhciBidWZmZXIKKyogb25Xb3JrKCkKICogICAgIENhbGxlZCBldmVyeSBwZXJpb2QgbGVuZ3RoIChlLmcuLCA0bXMpCiAqICAgICBDYWxscyBMT0dfSElTVF9UUwogKiBMT0dfSElTVF9UUwotKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKLSogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUyBvbmNlCi0qIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUworKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCB3cml0ZXMgc2luZ2xlIHRpbWVzdGFtcCB0byBidWZmZXIKKyogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRTIG9uY2UKKyogTkJMT0c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VFMKICogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZyBvbiBoYXNoIGFuZCBjdXJyZW50IHRpbWVzdGFtcAogKiAgICAgdGltZSBpcyBpbiBDTE9DS19NT05PVE9OSUMgY29udmVydGVkIHRvIG5zCiAqIE5CTE9HOjpXcml0ZXI6OmxvZyhFdmVudCwgY29uc3Qgdm9pZCosIHNpemVfdCkKQEAgLTQ0LDYgKzQ0LDggQEAKICogc3NpemVfdCBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6b2J0YWluCiAqICAgICBEZXRlcm1pbmVzIHJlYWRhYmxlIGJ1ZmZlciBzZWN0aW9uIHZpYSBwb2ludGVyIGFyaXRobWV0aWMgb24gcmVhZGVyCiAqICAgICBhbmQgd3JpdGVyIHBvaW50ZXJzCisqIFNpbWlsYXJseSwgTE9HX0FVRElPX1NUQVRFKCkgaXMgY2FsbGVkIGJ5IG9uU3RhdGVDaGFuZ2Ugd2hlbmV2ZXIgYXVkaW8gaXMKKyogdHVybmVkIG9uIG9yIG9mZiwgYW5kIHdyaXRlcyB0aGlzIG5vdGlmaWNhdGlvbiB0byB0aGUgRklGTy4KICoKICogMikgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHNoYXJlZCBtZW1vcnkKICogVGhyZWFkOjp0aHJlYWRsb29wKCkKQEAgLTUxLDYgKzUzLDcgQEAKICogTkJMb2c6Ok1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkKICogICAgIGNhbGxzIE5CTG9nOjpNZXJnZXI6Om1lcmdlCiAqIE5CTG9nOjpNZXJnZXI6Om1lcmdlCisqICAgICBNZXJnZXMgc25hcHNob3RzIHNvcnRlZCBieSB0aW1lc3RhbXAKICogICAgIGZvciBlYWNoIHJlYWRlciBpbiB2ZWN0b3Igb2YgY2xhc3MgTmFtZWRSZWFkZXIsCiAqICAgICBjYWxsc05hbWVkUmVhZGVyOjpyZWFkZXIoKS0+Z2V0U25hcHNob3QKICogICAgIFRPRE86IGNoZWNrIHdoZXRoZXIgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyByZWxldmFudApAQCAtNTksMTEgKzYyLDEyIEBACiAqICAgICBjYWxscyBtRmlmb1JlYWRlci0+b2J0YWluIHRvIGZpbmQgcmVhZGFibGUgZGF0YQogKiAgICAgc2V0cyBzbmFwc2hvdC5iZWdpbigpIGFuZCAuZW5kKCkgaXRlcmF0b3JzIHRvIGJvdW5kYXJpZXMgb2YgdmFsaWQgZW50cmllcwogKiAgICAgbW92ZXMgdGhlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIHRoZSBsYXN0IGVudHJ5IHJlYWQKLSogICAgIGluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciBpcyBpbiBzaGFyZWQgbWVtb3J5LiBpbiAoMyksIHRoZSBidWZmZXIgaXMgcHJpdmF0ZQorKiAgICAgaW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGlzIGluIHNoYXJlZCBtZW1vcnkuIGluICg0KSwgdGhlIGJ1ZmZlciBpcyBwcml2YXRlCiAqCiAqIDMpIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBwcml2YXRlIGJ1ZmZlcgogKiBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAKLSogICAgIGNhbGxzIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50KSBvbiBpbnN0YW5jZSBvZiBzdWJjbGFzcyBtZXJnZVJlYWRlcgorKiAgICAgY2FsbHMgTkJMb2c6OlJlYWRlcjo6ZHVtcChDT05TT0xFKQorKiAgICAgVGhlIHByaXZhdGUgYnVmZmVyIGNvbnRhaW5zIGFsbCBsb2dzIGZvciBhbGwgcmVhZGVycyBpbiBzaGFyZWQgbWVtb3J5CiAqIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50KQogKiAgICAgY2FsbHMgZ2V0U25hcHNob3Qgb24gdGhlIGN1cnJlbnQgcmVhZGVyCiAqICAgICBjYWxscyBkdW1wKGludCwgc2l6ZV90LCBTbmFwc2hvdCkKQEAgLTcyLDkgKzc2LDEwIEBACiAqICAgICAoc3RyaW5nLCB0aW1lc3RhbXAsIGV0Yy4uLikKICogICAgIEluIHRoZSBjYXNlIG9mIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgYWRkcyBhIGxpc3Qgb2YgdGltZXN0YW1wIHNlcXVlbmNlcwogKiAgICAgKGhpc3RvZ3JhbSBlbnRyeSkgdG8gTkJMb2c6Om1IaXN0cwotKiAgICAgSW4gdGhlIGNhc2Ugb2YgRVZFTlRfSElTVE9HUkFNX0ZMVVNILCBjYWxscyBkcmF3SGlzdG9ncmFtIG9uIGVhY2ggZWxlbWVudCBpbgotKiAgICAgdGhlIGxpc3QgYW5kIGVyYXNlcyBpdAotKiAgICAgVE9ETzogd2hlbiBkbyB0aGVzZSBldmVudHMgb2NjdXI/CisqICAgICBUT0RPOiBhZGQgZXZlcnkgSElTVE9HUkFNX0VOVFJZX1RTIHRvIHR3bworKiAgICAgY2lyY3VsYXIgYnVmZmVyczogb25lIHNob3J0LXRlcm0gYW5kIG9uZSBsb25nLXRlcm0gKGNhbiBhZGQgZXZlbiBsb25nZXItdGVybQorKiAgICAgc3RydWN0dXJlcyBpbiB0aGUgZnV0dXJlKS4gV2hlbiBkdW1wIGlzIGNhbGxlZCwgcHJpbnQgZXZlcnl0aGluZyBjdXJyZW50bHkKKyogICAgIGluIHRoZSBidWZmZXIuCiAqIE5CTG9nOjpkcmF3SGlzdG9ncmFtCiAqICAgICBpbnB1dDogdGltZXN0YW1wIGFycmF5CiAqICAgICBidWNrZXRzIHRoaXMgdG8gYSBoaXN0b2dyYW0gYW5kIHByaW50cwpAQCAtODIsNyArODcsNyBAQAogKi8KIAogI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KQEAgLTEwMiw2ICsxMDcsOCBAQAogI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KIC8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC0xMzQsNyArMTQxLDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOwotICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0ZMVVNIOgorICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6CiAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6CiAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKICAgICBkZWZhdWx0OgpAQCAtNTEzLDcgKzUyMCw3IEBACiAgICAgbG9nKEVWRU5UX0hBU0gsICZoYXNoLCBzaXplb2YoaGFzaCkpOwogfQogCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hpc3RUUyhsb2dfaGFzaF90IGhhc2gpCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpCiB7CiAgICAgaWYgKCFtRW5hYmxlZCkgewogICAgICAgICByZXR1cm47CkBAIC01MjIsMjIgKzUyOSw3IEBACiAgICAgZGF0YS5oYXNoID0gaGFzaDsKICAgICBkYXRhLnRzID0gZ2V0X21vbm90b25pY19ucygpOwogICAgIGlmIChkYXRhLnRzID4gMCkgewotICAgICAgICBsb2coRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGlzdFRzRW50cnkgZGF0YTsKLSAgICBkYXRhLmhhc2ggPSBoYXNoOwotICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKGRhdGEudHMgPiAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICBsb2coZXZlbnQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwogICAgIH0KQEAgLTc3MSwxNSArNzYzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTfTsKIGNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRkxVU0h9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKKwogTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCiAgICAgOiBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwogICAgICAgbUZkKC0xKSwgbUluZGVudCgwKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CiAgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKICAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgZmluZEdsaXRjaChmYWxzZSkKKyAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCiB7CiB9CiAKQEAgLTc5NSwzOSArNzg3LDYgQEAKICAgICBkZWxldGUgbUZpZm87CiB9CiAKLWlubGluZSBzdGF0aWMgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7Ci0gICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKLX0KLQotLy8gUHJvZHVjZXMgYSBsb2cgd2FybmluZyBpZiB0aGUgdGltaW5nIG9mIHJlY2VudCBidWZmZXIgcGVyaW9kcyBjYXVzZWQgYSBnbGl0Y2gKLS8vIENvbXB1dGVzIHN1bSBvZiBydW5uaW5nIHdpbmRvdyBvZiB0aHJlZSBidWZmZXIgcGVyaW9kcwotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGJ1ZmZlciBwZXJpb2RzIGxlYXZlIGVub3VnaCBDUFUgdGltZSBmb3IgdGhlIG5leHQgb25lCi0vLyBlLmcuIGlmIGEgYnVmZmVyIHBlcmlvZCBpcyBleHBlY3RlZCB0byBiZSA0IG1zIGFuZCBhIGJ1ZmZlciByZXF1aXJlcyAzIG1zIG9mIENQVSB0aW1lLAotLy8gaGVyZSBhcmUgc29tZSBnbGl0Y2ggY2FzZXM6Ci0vLyA0ICsgNCArIDYgOyA1ICsgNCArIDU7IDIgKyAyICsgMTAKLS8vIFRPRE86IGRldmVsb3AgdGhpcyBjb2RlIHRvIHRyYWNrIGNoYW5nZXMgaW4gaGlzdG9ncmFtIGRpc3RyaWJ1dGlvbiBpbiBhZGRpdGlvbgotLy8gdG8gLyBpbnN0ZWFkIG9mIGdsaXRjaGVzCi12b2lkIE5CTG9nOjpSZWFkZXI6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKLSAgICAvL1RPRE86IG1lYXN1cmUga1BlcmlvZExlbiBhbmQga1JhdGlvIGZyb20gdGhlIGRhdGEgYXMgdGhleSBtYXkgY2hhbmdlLgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZExlbiA9IDQ7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtSYXRpbyA9IDAuNzU7IC8vIGVzdGltYXRlIG9mIENQVSB0aW1lIGFzIHJhdGlvIG9mIHBlcmlvZCBsZW5ndGgKLSAgICAvLyBEQUMgcHJvY2Vzc2luZyB0aW1lIGZvciA0IG1zIGJ1ZmZlcgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZFRpbWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kKGtQZXJpb2RMZW4gKiBrUmF0aW8pKTsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtOdW1CdWZmID0gMzsgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgY29uc2lkZXJlZCBpbiBsb2NhbCBoaXN0b3J5Ci0gICAgc3RkOjpkZXF1ZTxpbnQ+IHBlcmlvZHMoa051bUJ1ZmYsIGtQZXJpb2RMZW4pOwotICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgeyAvLyBza2lwIGZpcnN0IHRpbWUgZW50cnkKLSAgICAgICAgcGVyaW9kcy5wdXNoX2Zyb250KGRlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pKTsKLSAgICAgICAgcGVyaW9kcy5wb3BfYmFjaygpOwotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGFsbCBnbGl0Y2ggY2FzZXMgYXJlIGNvdmVyZWQKLSAgICAgICAgaWYgKHN0ZDo6YWNjdW11bGF0ZShwZXJpb2RzLmJlZ2luKCksIHBlcmlvZHMuZW5kKCksIDApID4ga051bUJ1ZmYgKiBrUGVyaW9kTGVuICsKLSAgICAgICAgICAgIGtQZXJpb2RMZW4gLSBrUGVyaW9kVGltZSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOwotICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTGVuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KIGNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7CiAgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CkBAIC05MTEsNjEgKzg3MCwxNyBAQAogCiB9CiAKLS8vIHdyaXRlcyBzYW1wbGUgZGVsdGFzIHRvIGZpbGUsIGVpdGhlciB0cnVuY2F0aW5nIG9yIGFwcGVuZGluZwotaW5saW5lIHZvaWQgd3JpdGVIaXN0VG9GaWxlKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLCBib29sIGFwcGVuZCkgewotICAgIC8vIG5hbWUgb2YgZmlsZSBvbiBhdWRpb3NlcnZlcgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrTmFtZSA9IChjaGFyICopIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIvc2FtcGxlX3Jlc3VsdHMudHh0IjsKLSAgICAvLyBzdG9yZXMgZGVsdGFzIGJldHdlZW4gdGhlIHNhbXBsZXMKLSAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBpbnRlcnZhbHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGludGVydmFscy5wdXNoX2JhY2soZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSkpOwotICAgIH0KLSAgICBpZiAoaW50ZXJ2YWxzLmVtcHR5KCkpIHJldHVybjsKLSAgICAvLyBEZWxldGVzIG1heGltdW0gdmFsdWUgaW4gYSBoaXN0b2dyYW0uIFRlbXAgcXVpY2sgZml4LgotICAgIC8vIEZJWE1FOiBuZWVkIHRvIGZpbmQgcm9vdCBjYXVzZSBvZiBhcHByb3guIDM1dGggZWxlbWVudCBmcm9tIHRoZSBlbmQKLSAgICAvLyBjb25zaXN0ZW50bHkgYmVpbmcgYW4gb3V0bGllciBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIG9mIGEgZmx1c2gKLSAgICAvLyBBTE9HVygiJSIgUFJJZDY0ICJiZWZvcmUiLCAoaW50NjRfdCkgKihzdGQ6Om1heF9lbGVtZW50KGludGVydmFscy5iZWdpbigpLCBpbnRlcnZhbHMuZW5kKCkpKSk7Ci0gICAgaW50ZXJ2YWxzLmVyYXNlKHN0ZDo6bWF4X2VsZW1lbnQoaW50ZXJ2YWxzLmJlZ2luKCksIGludGVydmFscy5lbmQoKSkpOwotICAgIC8vIEFMT0dXKCIlIiBQUklkNjQgImFmdGVyIiwgKGludDY0X3QpICooc3RkOjptYXhfZWxlbWVudChpbnRlcnZhbHMuYmVnaW4oKSwgaW50ZXJ2YWxzLmVuZCgpKSkpOwotICAgIHN0ZDo6b2ZzdHJlYW0gb2ZzOwotICAgIG9mcy5vcGVuKGtOYW1lLCBhcHBlbmQgPyBzdGQ6Omlvczo6YXBwIDogc3RkOjppb3M6OnRydW5jKTsKLSAgICBpZiAoIW9mcykgewotICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiBmaWxlICVzIiwga05hbWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW50ZXJ2YWxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG9mcyA8PCBpbnRlcnZhbHNbaV0gPDwgIlxuIjsKLSAgICB9Ci0gICAgb2ZzLmNsb3NlKCk7Ci19Ci0KKy8vIFRPRE86IG1vdmUgdGhpcyB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCisvLyBUT0RPOiBtYWtlIGNhbGwgdG8gZHVtcCBwZXJpb2RpYyBzbyB0aGF0IGRhdGEgaW4gc2hhcmVkIEZJRk8gZG9lcyBub3QgZ2V0IG92ZXJ3cml0dGVuCiB2b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdCAmc25hcHNob3QpCiB7Ci0gIC8vICBDYWxsU3RhY2sgY3MoTE9HX1RBRyk7Ci0jaWYgMAotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICB0aW1lX3QgbWF4U2VjID0gLTE7Ci0gICAgd2hpbGUgKGVudHJ5IC0gc3RhcnQgPj0gKGludCkgRW50cnk6OmtPdmVyaGVhZCkgewotICAgICAgICBpZiAocHJldkVudHJ5IC0gc3RhcnQgPCAwIHx8ICFwcmV2RW50cnkuaGFzQ29uc2lzdGVudExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJldkVudHJ5LT50eXBlID09IEVWRU5UX1RJTUVTVEFNUCkgewotICAgICAgICAgICAgaWYgKHByZXZFbnRyeS0+bGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29ycnVwdAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldkVudHJ5LmNvcHlEYXRhKCh1aW50OF90KikgJnRzKTsKLSAgICAgICAgICAgIGlmICh0cy50dl9zZWMgPiBtYXhTZWMpIHsKLSAgICAgICAgICAgICAgICBtYXhTZWMgPSB0cy50dl9zZWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLS1lbnRyeTsKLSAgICAgICAgLS1wcmV2RW50cnk7Ci0gICAgfQotI2VuZGlmCiAgICAgbUZkID0gZmQ7CiAgICAgbUluZGVudCA9IGluZGVudDsKICAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKyAgICAvLyBGSVhNRTogdGhpcyBpcyBub3QgdGhyZWFkIHNhZmUKKyAgICAvLyBUT0RPOiBuZWVkIGEgc2VwYXJhdGUgaW5zdGFuY2Ugb2YgcGVyZm9ybWFuY2VBbmFseXNpcyBmb3IgZWFjaCB0aHJlYWQKKyAgICAvLyB1c2VkIHRvIHN0b3JlIGRhdGEgYW5kIHRvIGNhbGwgYW5hbHlzaXMgZnVuY3Rpb25zCisgICAgc3RhdGljIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZUFuYWx5c2lzIHBlcmZvcm1hbmNlQW5hbHlzaXM7CiAgICAgc2l6ZV90IGxvc3QgPSBzbmFwc2hvdC5sb3N0KCkgKyAoc25hcHNob3QuYmVnaW4oKSAtIEVudHJ5SXRlcmF0b3Ioc25hcHNob3QuZGF0YSgpKSk7CiAgICAgaWYgKGxvc3QgPiAwKSB7CiAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBsb3N0ICV6dSBieXRlcyB3b3J0aCBvZiBldmVudHMiLCBsb3N0KTsKQEAgLTk3Myw4NSArODg4LDkgQEAKICAgICAgICAgLy8gICAgICBsb2cgdG8gcHVzaCBpdCBvdXQuICBDb25zaWRlciBrZWVwaW5nIHRoZSB0aW1lc3RhbXAvYm9keSBiZXR3ZWVuIGNhbGxzIHRvIGNvcHlFbnRyeURhdGFBdCgpLgogICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwogICAgIH0KLSNpZiAwCi0gICAgc2l6ZV90IHdpZHRoID0gMTsKLSAgICB3aGlsZSAobWF4U2VjID49IDEwKSB7Ci0gICAgICAgICsrd2lkdGg7Ci0gICAgICAgIG1heFNlYyAvPSAxMDsKLSAgICB9Ci0gICAgaWYgKG1heFNlYyA+PSAwKSB7Ci0gICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslKnNdIiwgKGludCkgd2lkdGggKyA0LCAiIik7Ci0gICAgfQotICAgIGJvb2wgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKLSNlbmRpZgogCiAgICAgZm9yIChhdXRvIGVudHJ5ID0gc25hcHNob3QuYmVnaW4oKTsgZW50cnkgIT0gc25hcHNob3QuZW5kKCk7KSB7CiAgICAgICAgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKLSNpZiAwCi0gICAgICAgIGNhc2UgRVZFTlRfU1RSSU5HOgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoaW50KSBlbnRyeS5sZW5ndGgoKSwgZW50cnkuZGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1RJTUVTVEFNUDogewotICAgICAgICAgICAgLy8gYWxyZWFkeSBjaGVja2VkIHRoYXQgbGVuZ3RoID09IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpOwotICAgICAgICAgICAgZW50cnkuY29weURhdGEoKGNvbnN0IHVpbnQ4X3QqKSAmdHMpOwotICAgICAgICAgICAgbG9uZyBwcmV2TnNlYyA9IHRzLnR2X25zZWM7Ci0gICAgICAgICAgICBsb25nIGRlbHRhTWluID0gTE9OR19NQVg7Ci0gICAgICAgICAgICBsb25nIGRlbHRhTWF4ID0gLTE7Ci0gICAgICAgICAgICBsb25nIGRlbHRhVG90YWwgPSAwOwotICAgICAgICAgICAgYXV0byBhdXgoZW50cnkpOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICsrYXV4OwotICAgICAgICAgICAgICAgIGlmIChlbmQgLSBhdXggPj0gMCB8fCBhdXgudHlwZSgpICE9IEVWRU5UX1RJTUVTVEFNUCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRzTmV4dDsKLSAgICAgICAgICAgICAgICBhdXguY29weURhdGEoKGNvbnN0IHVpbnQ4X3QqKSAmdHNOZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAodHNOZXh0LnR2X3NlYyAhPSB0cy50dl9zZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSB0c05leHQudHZfbnNlYyAtIHByZXZOc2VjOwotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IGRlbHRhTWluKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhTWluID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IGRlbHRhTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhTWF4ID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlbHRhVG90YWwgKz0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgcHJldk5zZWMgPSB0c05leHQudHZfbnNlYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBuID0gKGF1eCAtIGVudHJ5KSAvIChzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSArIDMgLypFbnRyeTo6a092ZXJoZWFkPyovKTsKLSAgICAgICAgICAgIGlmIChkZWZlcnJlZFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7Ci0gICAgICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOwotICAgICAgICAgICAgaWYgKG4gPj0ga1NxdWFzaFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkIHRvIC4lLjAzZCBieSAuJS4wM2QgdG8gLiUuMDNkXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB0cy50dl9zZWMsIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGRlbHRhTWluIC8gMTAwMDAwMCksIChpbnQpIChkZWx0YU1heCAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IGF1eDsKLSAgICAgICAgICAgICAgICAvLyBhZHZhbmNlID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpIHRzLnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICBkZWZlcnJlZFRpbWVzdGFtcCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9JTlRFR0VSOgotICAgICAgICAgICAgYXBwZW5kSW50KCZib2R5LCBlbnRyeS5kYXRhKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfRkxPQVQ6Ci0gICAgICAgICAgICBhcHBlbmRGbG9hdCgmYm9keSwgZW50cnkuZGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1BJRDoKLSAgICAgICAgICAgIGFwcGVuZFBJRCgmYm9keSwgZW50cnkuZGF0YSgpLCBlbnRyeS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgogICAgICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKICAgICAgICAgICAgIGVudHJ5ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGVudHJ5KSwgJnRpbWVzdGFtcCwgJmJvZHkpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDYzLDQwICs5MDIsMTIgQEAKICAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKICAgICAgICAgICAgIGludDY0X3QgdHM7CiAgICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPGxvZ19oYXNoX3QsIGludD4ga2V5KGhhc2gsIGRhdGEtPmF1dGhvcik7Ci0gICAgICAgICAgICAvLyBUT0RPIG1pZ2h0IHdhbnQgdG8gZmlsdGVyIGV4Y2Vzc2l2ZWx5IGhpZ2ggb3V0bGllcnMsIHdoaWNoIGFyZSB1c3VhbGx5IGNhdXNlZAotICAgICAgICAgICAgLy8gYnkgdGhlIHRocmVhZCBiZWluZyBpbmFjdGl2ZS4KLSAgICAgICAgICAgIG1IaXN0c1trZXldLnB1c2hfYmFjayh0cyk7CisgICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmxvZ1RzRW50cnkodHMpOwogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIGRyYXdzIGhpc3RvZ3JhbXMgc3RvcmVkIGluIGdsb2JhbCBSZWFkZXI6Om1IaXN0cyBhbmQgZXJhc2VzIHRoZW0KLSAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRkxVU0g6IHsKLSAgICAgICAgICAgIEhpc3RvZ3JhbUVudHJ5IGhpc3RFbnRyeShlbnRyeSk7Ci0gICAgICAgICAgICAvLyBMb2cgdGltZXN0YW1wCi0gICAgICAgICAgICAvLyBUaW1lc3RhbXAgb2YgY2FsbCB0byBkcmF3SGlzdG9ncmFtLCBub3Qgd2hlbiBhdWRpbyB3YXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaGlzdEVudHJ5LnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotICAgICAgICAgICAgLy8gTG9nIGhpc3RvZ3JhbXMKLSAgICAgICAgICAgIHNldEZpbmRHbGl0Y2godHJ1ZSk7Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiSGlzdG9ncmFtIGZsdXNoIC0gIik7Ci0gICAgICAgICAgICBoYW5kbGVBdXRob3IoaGlzdEVudHJ5LCAmYm9keSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaGlzdCA9IG1IaXN0cy5iZWdpbigpOyBoaXN0ICE9IG1IaXN0cy5lbmQoKTspIHsKLSAgICAgICAgICAgICAgICBpZiAoaGlzdC0+Zmlyc3Quc2Vjb25kID09IGhpc3RFbnRyeS5hdXRob3IoKSkgewotICAgICAgICAgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiJVgiLCAoaW50KWhpc3QtPmZpcnN0LmZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRHbGl0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0SWZHbGl0Y2goaGlzdC0+c2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZmlsZSB0byBlbXB0eSBhbmQgd3JpdGUgZGF0YSBmb3IgYWxsIGhpc3RvZ3JhbXMgaW4gdGhpcyBzZXQKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVIaXN0VG9GaWxlKGhpc3QtPnNlY29uZCwgaGlzdCAhPSBtSGlzdHMuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdIaXN0b2dyYW0oJmJvZHksIGhpc3QtPnNlY29uZCwgdHJ1ZSwgaW5kZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaGlzdCA9IG1IaXN0cy5lcmFzZShoaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICArK2hpc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7CisgICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7CiAgICAgICAgICAgICArK2VudHJ5OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMTAsMTAgKzkyMSwxMCBAQAogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICAgICAgfQorICAgIH0KKyAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLnJlcG9ydFBlcmZvcm1hbmNlKCZib2R5KTsKKyAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CiAgICAgfQogfQogCkBAIC0xMTM5LDE2ICs5NTAsNiBAQAogICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKIH0KIAotdm9pZCBOQkxvZzo6UmVhZGVyOjpzZXRGaW5kR2xpdGNoKGJvb2wgcykKLXsKLSAgICBmaW5kR2xpdGNoID0gczsKLX0KLQotYm9vbCBOQkxvZzo6UmVhZGVyOjppc0ZpbmRHbGl0Y2goKSBjb25zdAotewotICAgIHJldHVybiBmaW5kR2xpdGNoOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBOQkxvZzo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKQEAgLTEyODMsMTI2ICsxMDg0LDYgQEAKICAgICByZXR1cm4gYXJnOwogfQogCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIHdoaWxlICh4ID4gMCkgewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0KLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLXN0YXRpYyBzdGQ6Om1hcDxpbnQsIGludD4gYnVpbGRCdWNrZXRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7Ci0gICAgLy8gVE9ETyBhbGxvdyBidWNrZXRzIG9mIHZhcmlhYmxlIHJlc29sdXRpb24KLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgKytidWNrZXRzW2RlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pXTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Y2tldHM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgbG9nMih1aW50MzJfdCB4KSB7Ci0gICAgLy8gVGhpcyB3b3JrcyBmb3IgeCA+IDAKLSAgICByZXR1cm4gMzEgLSBfX2J1aWx0aW5fY2x6KHgpOwotfQotCi0vLyBUT0RPIHB1dCB0aGlzIGZ1bmN0aW9uIGluIHNlcGFyYXRlIGZpbGUuIE1ha2UgaXQgcmV0dXJuIGEgc3RkOjpzdHJpbmcgaW5zdGVhZCBvZiBtb2RpZnlpbmcgYm9keQotLyoKLUV4YW1wbGUgb3V0cHV0OgotWzU0LjIzNF0gSGlzdG9ncmFtIGZsdXNoIC0gQXVkaW9PdXRfRDoKLUhpc3RvZ3JhbSAzMzY0MEJGMQotICAgICAgICAgICAgWyAxXVsgMV1bIDFdWyAzXVs1NF1bNjldWyAxXVsgMl1bIDFdCi0gICAgICAgIDY0fCAgICAgICAgICAgICAgICAgICAgICBbXQotICAgICAgICAzMnwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgMTZ8ICAgICAgICAgICAgICAgICAgW10gIFtdCi0gICAgICAgICA4fCAgICAgICAgICAgICAgICAgIFtdICBbXQotICAgICAgICAgNHwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgIDJ8X19fX19fX19fX19fX19bXV9fW11fX1tdX19fX19fW11fX19fCi0gICAgICAgICAgICAgIDQgICA1ICAgNiAgIDggICA5ICAxMCAgMTEgIDEzICAxNQotTm90aWNlIHRoYXQgYWxsIHZhbHVlcyB0aGF0IGZhbGwgaW4gdGhlIHNhbWUgcm93IGhhdmUgdGhlIHNhbWUgaGVpZ2h0ICg2NSBhbmQgMTI3IGFyZSBkaXNwbGF5ZWQKLWlkZW50aWNhbGx5KS4gVGhhdCdzIHdoeSBleGFjdCBjb3VudHMgYXJlIGFkZGVkIGF0IHRoZSB0b3AuCi0qLwotdm9pZCBOQkxvZzo6UmVhZGVyOjpkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQpIHsKLSAgICAvLyB0aGlzIGF2b2lkcyBzb21lIGNvcm5lciBjYXNlcwotICAgIGlmIChzYW1wbGVzLnNpemUoKSA8PSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gdGVtcCBjb2RlIGZvciBkZWJ1Z2dpbmcgdGhlIG91dGxpZXIgdGltZXN0YW1wCi0gICAgY29uc3QgaW50IGtNYXhNcyA9IDEwMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpLTE7ICsraSkgewotICAgICAgICBjb25zdCBpbnQgY3VyckRlbHRhID0gZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSk7Ci0gICAgICAgIGlmIChjdXJyRGVsdGEgPiBrTWF4TXMpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG5sb2NhdGlvbjogJXp1LCBzaXplOiAlenUsIHBvcyBmcm9tIGVuZDogJXp1LCAlZFx0IiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMuc2l6ZSgpLCBzYW1wbGVzLnNpemUoKSAtIGksIGN1cnJEZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklYTUU6IGFzIGNhbiBiZSBzZWVuIHdoZW4gcHJpbnRpbmcgdGhlIHZhbHVlcywgdGhlIG91dGxpZXIgdGltZXN0YW1wcyB0eXBpY2FsbHkgb2NjdXIKLSAgICAvLyBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIDM1IHRvIDM4IGluZGljZXMgZnJvbSB0aGUgZW5kIChtb3N0IG9mdGVuIDM1KS4KLSAgICAvLyBUT0RPOiBidWlsZCBoaXN0b2dyYW0gYnVja2V0cyBlYXJsaWVyIGFuZCBkaXNjYXJkIHRpbWVzdGFtcHMgdG8gc2F2ZSBtZW1vcnkKLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0cyA9IGJ1aWxkQnVja2V0cyhzYW1wbGVzKTsKLSAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIGFsbCBpbnRzIHRvIHVpbnQzMl90IG9yIHVpbnQ2NF90Ci0KLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICctJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2dTY2FsZSA/IGxvZzIobWF4Q291bnQpICsgMSA6IG1heENvdW50OyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCi0gICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZihsb2dTY2FsZSA/IHBvdygyLCBoZWlnaHQpIDogbWF4Q291bnQpOwotICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2YobWF4RGVsdGEpICsgMSwgMyksIGxlZnRQYWRkaW5nICsgMik7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGxlZnRQYWRkaW5nICsgMTEsICJPY2N1cnJlbmNlcyIpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IGxvZ1NjYWxlID8gKDEgPDwgcm93KSA6IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLQotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOwotfQotCiBOQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CiAgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9PV05FUlMgYi9tZWRpYS9saWJuYmFpby9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYmRkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KKy8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKK1BlcmZvcm1hbmNlQW5hbHlzaXM6OlBlcmZvcm1hbmNlQW5hbHlzaXMoKSB7CisgICAgLy8gVGhlc2UgdmFyaWFibGVzIHdpbGwgYmUgKEZJWE1FKSBsZWFybmVkIGZyb20gdGhlIGRhdGEKKyAgICBrUGVyaW9kTXMgPSA0OyAvLyB0eXBpY2FsIGJ1ZmZlciBwZXJpb2QgKG1vZGUpCisgICAgLy8gYXZlcmFnZSBudW1iZXIgb2YgTXMgc3BlbnQgcHJvY2Vzc2luZyBidWZmZXIKKyAgICBrUGVyaW9kTXNDUFUgPSBzdGF0aWNfY2FzdDxpbnQ+KGtQZXJpb2RNcyAqIGtSYXRpbyk7Cit9CisKKy8vIGNvbnZlcnRzIGEgdGltZSBzZXJpZXMgaW50byBhIG1hcC4ga2V5OiBidWZmZXIgcGVyaW9kIGxlbmd0aC4gdmFsdWU6IGNvdW50CitzdGF0aWMgc3RkOjptYXA8aW50LCBpbnQ+IGJ1aWxkQnVja2V0cyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcykgeworICAgIC8vIFRPRE8gYWxsb3cgYnVja2V0cyBvZiB2YXJpYWJsZSByZXNvbHV0aW9uCisgICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHM7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICsrYnVja2V0c1tkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKV07CisgICAgfQorICAgIHJldHVybiBidWNrZXRzOworfQorCitzdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKKyAgICBpbnQgd2lkdGggPSAwOworICAgIHdoaWxlICh4ID4gMCkgeworICAgICAgICArK3dpZHRoOworICAgICAgICB4IC89IDEwOworICAgIH0KKyAgICByZXR1cm4gd2lkdGg7Cit9CisKKy8vIEdpdmVuIGEgc2VyaWVzIG9mIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMsCisvLyBidWNrZXRzIHRoZSB0aW1lIGludGVydmFscyBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKKy8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQorLy8gc21hbGwgb3IgbGFyZ2UgdmFsdWVzIGFuZCBzdG9yZXMgdGhlc2UgYXMgcGVha3MsIGFuZCBmbHVzaGVzCisvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKCkgeworICAgIC8vIDEpIGFuYWx5emUgdGhlIHNlcmllcyB0byBzdG9yZSBhbGwgb3V0bGllcnMgYW5kIHRoZWlyIGV4YWN0IHRpbWVzdGFtcHM6CisgICAgc3RvcmVPdXRsaWVyRGF0YShtVGltZVN0YW1wU2VyaWVzKTsKKworICAgIC8vIDIpIGRldGVjdCBwZWFrcyBpbiB0aGUgb3V0bGllciBzZXJpZXMKKyAgICBkZXRlY3RQZWFrcygpOworCisgICAgLy8gMykgY29tcHV0ZSBpdHMgaGlzdG9ncmFtLCBhcHBlbmQgdG8gbVJlY2VudEhpc3RzIGFuZCBjbGVhciB0aGUgdGltZSBzZXJpZXMKKyAgICBtUmVjZW50SGlzdHMuZW1wbGFjZV9iYWNrKHN0YXRpY19jYXN0PHRpbWVzdGFtcD4obVRpbWVTdGFtcFNlcmllc1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEJ1Y2tldHMobVRpbWVTdGFtcFNlcmllcykpOworICAgIC8vIGRvIG5vdCBsZXQgbVJlY2VudEhpc3RzIGV4Y2VlZCBjYXBhY2l0eQorICAgIC8vIEFMT0dEKCJtUmVjZW50SGlzdHMgc2l6ZTogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KG1SZWNlbnRIaXN0cy5zaXplKCkpKTsKKyAgICBpZiAobVJlY2VudEhpc3RzLnNpemUoKSA+PSBrUmVjZW50SGlzdHNDYXBhY2l0eSkgeworICAgICAgICAvLyAgQUxPR0QoInBvcHBlZCBiYWNrIG1SZWNlbnRIaXN0cyIpOworICAgICAgICBtUmVjZW50SGlzdHMucG9wX2Zyb250KCk7CisgICAgfQorICAgIG1UaW1lU3RhbXBTZXJpZXMuY2xlYXIoKTsKK30KKworLy8gZm9yY2VzIHNob3J0LXRlcm0gaGlzdG9ncmFtIHN0b3JhZ2UgdG8gYXZvaWQgYWRkaW5nIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAorLy8gdG8gYnVmZmVyIHBlcmlvZCBkYXRhCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmhhbmRsZVN0YXRlQ2hhbmdlKCkgeworICAgIEFMT0dEKCJoYW5kbGVTdGF0ZUNoYW5nZSIpOworICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworICAgIHJldHVybjsKK30KKworLy8gVGFrZXMgYSBzaW5nbGUgYnVmZmVyIHBlcmlvZCB0aW1lc3RhbXAgZW50cnkgaW5mb3JtYXRpb24gYW5kIHN0b3JlcyBpdCBpbiBhCisvLyB0ZW1wb3Jhcnkgc2VyaWVzIG9mIHRpbWVzdGFtcHMuIE9uY2UgdGhlIHNlcmllcyBpcyBmdWxsLCB0aGUgZGF0YSBpcyBhbmFseXplZCwKKy8vIHN0b3JlZCwgYW5kIGVtcHRpZWQuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmxvZ1RzRW50cnkoaW50NjRfdCB0cykgeworICAgIC8vIFRPRE8gbWlnaHQgd2FudCB0byBmaWx0ZXIgZXhjZXNzaXZlbHkgaGlnaCBvdXRsaWVycywgd2hpY2ggYXJlIHVzdWFsbHkgY2F1c2VkCisgICAgLy8gYnkgdGhlIHRocmVhZCBiZWluZyBpbmFjdGl2ZS4KKyAgICAvLyBTdG9yZSB0aW1lIHNlcmllcyBkYXRhIGZvciBlYWNoIHJlYWRlciBpbiBvcmRlciB0byBidWNrZXQgaXQgb25jZSB0aGVyZQorICAgIC8vIGlzIGVub3VnaCBkYXRhLiBUaGVuLCB3cml0ZSB0byByZWNlbnRIaXN0cyBhcyBhIGhpc3RvZ3JhbS4KKyAgICBtVGltZVN0YW1wU2VyaWVzLnB1c2hfYmFjayh0cyk7CisgICAgLy8gaWYgbGVuZ3RoIG9mIHRoZSB0aW1lIHNlcmllcyBoYXMgcmVhY2hlZCBrU2hvcnRIaXN0U2l6ZSBzYW1wbGVzLAorICAgIC8vIGFuYWx5emUgdGhlIGRhdGEgYW5kIGZsdXNoIHRoZSB0aW1lc3RhbXAgc2VyaWVzIGZyb20gbWVtb3J5CisgICAgaWYgKG1UaW1lU3RhbXBTZXJpZXMuc2l6ZSgpID49IGtTaG9ydEhpc3RTaXplKSB7CisgICAgICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworICAgIH0KK30KKworLy8gV2hlbiB0aGUgc2hvcnQtdGVybSBoaXN0b2dyYW0gYXJyYXkgbVJlY2VudEhpc3RzIGhhcyByZWFjaGVkIGNhcGFjaXR5LAorLy8gbWVyZ2UgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmUgdGhlbSBpbiBtTG9uZ1Rlcm1IaXN0cworLy8gY2xlYXJzIG1SZWNlbnRIaXN0cworLy8gVE9ETzogaGF2ZSBsb2dUc0VudHJ5IHdyaXRlIGRpcmVjdGx5IHRvIG1Mb25nVGVybUhpc3RzLCBkaXNjYXJkIG1SZWNlbnRIaXN0cywKKy8vIHN0YXJ0IGEgbmV3IGhpc3RvZ3JhbSB3aGVuIGEgcGVhayBvY2N1cnMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoUmVjZW50SGlzdHMoKSB7CisKKyAgICAvLyBCdWNrZXRzIGlzIHVzZWQgdG8gYWdncmVnYXRlIHNob3J0LXRlcm0gaGlzdG9ncmFtcy4KKyAgICBIaXN0b2dyYW0gYnVja2V0czsKKyAgICB0aW1lc3RhbXAgc3RhcnRpbmdUcyA9IG1SZWNlbnRIaXN0c1swXS5maXJzdDsKKworICAgIGZvciAoY29uc3QgYXV0byAmc2hvcnRIaXN0OiBtUmVjZW50SGlzdHMpIHsKKyAgICAgICAgLy8gSWYgdGhlIHRpbWUgYmV0d2VlbiBzdGFydGluZyBhbmQgZW5kaW5nIHRpbWVzdGFtcHMgaGFzIHJlYWNoZWQgdGhlIG1heGltdW0sCisgICAgICAgIC8vIGFkZCB0aGUgY3VycmVudCBoaXN0b2dyYW0gKGJ1Y2tldHMpIHRvIHRoZSBsb25nLXRlcm0gaGlzdG9ncmFtIGJ1ZmZlciwKKyAgICAgICAgLy8gY2xlYXIgYnVja2V0cywgYW5kIHN0YXJ0IGEgbmV3IGxvbmctdGVybSBoaXN0b2dyYW0gYWdncmVnYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgaWYgKGRlbHRhTXMoc3RhcnRpbmdUcywgc2hvcnRIaXN0LmZpcnN0KSA+PSBrTWF4SGlzdFRpbWVzcGFuTXMpIHsKKyAgICAgICAgICAgIG1Mb25nVGVybUhpc3RzLmVtcGxhY2VfYmFjayhzdGFydGluZ1RzLCBzdGQ6Om1vdmUoYnVja2V0cykpOworICAgICAgICAgICAgYnVja2V0cy5jbGVhcigpOworICAgICAgICAgICAgc3RhcnRpbmdUcyA9IHNob3J0SGlzdC5maXJzdDsKKyAgICAgICAgICAgIC8vIFdoZW4gbWVtb3J5IGlzIGZ1bGwsIGRlbGV0ZSBvbGRlc3QgaGlzdG9ncmFtCisgICAgICAgICAgICAvLyBUT0RPIHVzZSBhIGNpcmN1bGFyIGJ1ZmZlcgorICAgICAgICAgICAgaWYgKG1Mb25nVGVybUhpc3RzLnNpemUoKSA+PSBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgbUxvbmdUZXJtSGlzdHMucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgY3VycmVudCBoaXN0b2dyYW0gdG8gYnVja2V0cworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNvdW50UGFpciA6IHNob3J0SGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJ1Y2tldHNbY291bnRQYWlyLmZpcnN0XSArPSBjb3VudFBhaXIuc2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIG1SZWNlbnRIaXN0cy5jbGVhcigpOworICAgIC8vIFRPRE86IGRlY2lkZSB3aGVuL3doZXJlIHRvIGNhbGwgd3JpdGVUb0ZpbGUKKyAgICAvLyBUT0RPOiBhZGQgYSB0aHJlYWQtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlIG5hbWUKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga05hbWUgPSAoY29uc3QgY2hhciAqKSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlci9zYW1wbGVfcmVzdWx0cy50eHQiOworICAgIHdyaXRlVG9GaWxlKG1PdXRsaWVyRGF0YSwgbUxvbmdUZXJtSGlzdHMsIGtOYW1lLCBmYWxzZSk7Cit9CisKKy8vIEdpdmVuIGEgc2VyaWVzIG9mIG91dGxpZXIgaW50ZXJ2YWxzIChtT3V0bGllciBkYXRhKSwKKy8vIGxvb2tzIGZvciBjaGFuZ2VzIGluIGRpc3RyaWJ1dGlvbiAocGVha3MpLCB3aGljaCBjYW4gYmUgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgorLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIG1lYW4gdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCBzaWdtYSB0byAwLCBhbmQgdXBkYXRlcworLy8gdGhlbSBhcyBsb25nIGFzIG5vIHBlYWsgaXMgZGV0ZWN0ZWQuIFdoZW4gYSB2YWx1ZSBpcyBtb3JlIHRoYW4gJ3RocmVzaG9sZCcKKy8vIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiwgYSBwZWFrIGlzIGRldGVjdGVkIGFuZCB0aGUgbWVhbiBhbmQgc2lnbWEKKy8vIGFyZSBzZXQgdG8gdGhlIHBlYWsgdmFsdWUgYW5kIDAuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmRldGVjdFBlYWtzKCkgeworICAgIGlmIChtT3V0bGllckRhdGEuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY29tcHV0ZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24uIFVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHZhbHVlIGlzIGxhcmdlCisgICAgY29uc3QgZG91YmxlIGtUeXBpY2FsRGlmZiA9IHN0ZDo6YWNjdW11bGF0ZSgKKyAgICAgICAgbU91dGxpZXJEYXRhLmJlZ2luKCksIG1PdXRsaWVyRGF0YS5lbmQoKSwgMCwKKyAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8gbU91dGxpZXJEYXRhLnNpemUoKTsKKyAgICAvLyBBTE9HRCgidHlwaWNhbERpZmYgJWYiLCBrVHlwaWNhbERpZmYpOworCisgICAgLy8gaXRlcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlcXVlbmNlLCBvciB1cGRhdGVkIHRvIHRoZSBtb3N0IHJlY2VudCBwZWFrCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90Pj46Oml0ZXJhdG9yIHN0YXJ0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7CisgICAgLy8gdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcmUgdXBkYXRlZCBldmVyeSB0aW1lIGEgcGVhayBpcyBkZXRlY3RlZAorICAgIC8vIGluaXRpYWxpemUgZmlyc3QgdGltZS4gVGhlIG1lYW4gZnJvbSB0aGUgcHJldmlvdXMgc2VxdWVuY2UgaXMgc3RvcmVkCisgICAgLy8gZm9yIHRoZSBuZXh0IHNlcXVlbmNlLiBIZXJlLCB0aGV5IGFyZSBpbml0aWFsaXplZCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgaWYgKG1QZWFrRGV0ZWN0b3JNZWFuIDwgMCkgeworICAgICAgICBtUGVha0RldGVjdG9yTWVhbiA9IHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhcnQtPmZpcnN0KTsKKyAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICB9CisgICAgYXV0byBzcXIgPSBbXShhdXRvIHgpeyByZXR1cm4geCAqIHg7IH07CisgICAgZm9yIChhdXRvIGl0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7IGl0ICE9IG1PdXRsaWVyRGF0YS5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyBubyBzdXJwcmlzZSBvY2N1cnJlZDoKKyAgICAgICAgLy8gdGhlIG5ldyBlbGVtZW50IGlzIGEgc21hbGwgbnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbgorICAgICAgICBpZiAoKGZhYnMoaXQtPmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pIDwga1N0ZGRldlRocmVzaG9sZCAqIG1QZWFrRGV0ZWN0b3JTZCkgfHwKKyAgICAgICAgICAgICAvLyBvcjogcmlnaHQgYWZ0ZXIgcGVhayBoYXMgYmVlbiBkZXRlY3RlZCwgdGhlIGRlbHRhIGlzIHNtYWxsZXIgdGhhbiBhdmVyYWdlCisgICAgICAgICAgICAobVBlYWtEZXRlY3RvclNkID09IDAgJiYgZmFicyhpdC0+Zmlyc3QgLSBtUGVha0RldGVjdG9yTWVhbikgPCBrVHlwaWNhbERpZmYpKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG1lYW4gYW5kIHNkOgorICAgICAgICAgICAgLy8gY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzIChkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGludGVyYXRvciBhbmQgY3VycmVudCkKKyAgICAgICAgICAgIGNvbnN0IGludCBrTiA9IHN0ZDo6ZGlzdGFuY2Uoc3RhcnQsIGl0KSArIDE7CisgICAgICAgICAgICAvLyB1c3VhbCBmb3JtdWxhcyBmb3IgbWVhbiBhbmQgc2QKKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RkOjphY2N1bXVsYXRlKHN0YXJ0LCBpdCArIDEsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8ga047CisgICAgICAgICAgICBtUGVha0RldGVjdG9yU2QgPSBzcXJ0KHN0ZDo6YWNjdW11bGF0ZShzdGFydCwgaXQgKyAxLCAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgWz1dKGF1dG8gJmEsIGF1dG8gJmIpeyByZXR1cm4gYSArIHNxcihiLmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pO30pKSAvCisgICAgICAgICAgICAgICAgICAgICAgKChrTiA+IDEpPyBrTiAtIDEgOiBrTik7IC8vIGtOIC0gMTogbWVhbiBpcyBjb3JyZWxhdGVkIHdpdGggdmFyaWFuY2UKKyAgICAgICAgfQorICAgICAgICAvLyBzdXJwcmlzaW5nIHZhbHVlOiBzdG9yZSBwZWFrIHRpbWVzdGFtcCBhbmQgcmVzZXQgbWVhbiwgc2QsIGFuZCBzdGFydCBpdGVyYXRvcgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5lbXBsYWNlX2JhY2soaXQtPnNlY29uZCk7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgYSBjaXJjdWxhciBidWZmZXIgaXMgaW4gcGxhY2UKKyAgICAgICAgICAgIGlmIChtUGVha1RpbWVzdGFtcHMuc2l6ZSgpID49IGtQZWFrU2VyaWVzU2l6ZSkgeworICAgICAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpdC0+Zmlyc3QpOworICAgICAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICAgICAgICAgIHN0YXJ0ID0gaXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvLyBDYWxsZWQgYnkgTG9nVHNFbnRyeS4gVGhlIGlucHV0IGlzIGEgdmVjdG9yIG9mIHRpbWVzdGFtcHMuCisvLyBGaW5kcyBvdXRsaWVycyBhbmQgd3JpdGVzIHRvIG1PdXRsaWVyZGF0YS4KKy8vIEVhY2ggdmFsdWUgaW4gbU91dGxpZXJkYXRhIGNvbnNpc3RzIG9mOiA8b3V0bGllciB0aW1lc3RhbXAsIHRpbWUgZWxhcHNlZCBzaW5jZSBwcmV2aW91cyBvdXRsaWVyPi4KKy8vIGUuZy4gdGltZXN0YW1wcyAobXMpIDEsIDQsIDUsIDE2LCAxOCwgMjggd2lsbCBwcm9kdWNlIHBhaXJzICg0LCA1KSwgKDEzLCAxOCkuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIHRpbWUgc2VyaWVzIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQgaW50byBhIGhpc3RvZ3JhbS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmdGltZXN0YW1wcykgeworICAgIGlmICh0aW1lc3RhbXBzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBmaXJzdCBwYXNzOiBuZWVkIHRvIGluaXRpYWxpemUKKyAgICBpZiAobUVsYXBzZWQgPT0gMCkgeworICAgICAgICBtUHJldk5zID0gdGltZXN0YW1wc1swXTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZ0czogdGltZXN0YW1wcykgeworICAgICAgICBjb25zdCB1aW50NjRfdCBkaWZmTXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGVsdGFNcyhtUHJldk5zLCB0cykpOworICAgICAgICBpZiAoZGlmZk1zID49IHN0YXRpY19jYXN0PHVpbnQ2NF90PihrT3V0bGllck1zKSkgeworICAgICAgICAgICAgbU91dGxpZXJEYXRhLmVtcGxhY2VfYmFjayhtRWxhcHNlZCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1QcmV2TnMpKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBvbGRlc3QgdmFsdWUgaWYgdGhlIHZlY3RvciBpcyBmdWxsCisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgY2lyY3VsYXIgYnVmZmVyIGlzIGluIHBsYWNlCisgICAgICAgICAgICAvLyBGSVhNRTogbWFrZSBzdXJlIGtTaG9ydEhpc3RTaXplIGlzIGxhcmdlIGVub3VnaCB0aGF0IHRoYXQgZGF0YSB3aWxsIG5ldmVyIGJlIGxvc3QKKyAgICAgICAgICAgIC8vIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGZpbGUgb3IgdG8gYSBGSUZPCisgICAgICAgICAgICBpZiAobU91dGxpZXJEYXRhLnNpemUoKSA+PSBrT3V0bGllclNlcmllc1NpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0bGllckRhdGEucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRWxhcHNlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbUVsYXBzZWQgKz0gZGlmZk1zOworICAgICAgICBtUHJldk5zID0gdHM7CisgICAgfQorfQorCisKKy8vIEZJWE1FOiBkZWxldGUgdGhpcyB0ZW1wb3JhcnkgdGVzdCBjb2RlLCByZWN5Y2xlZCBmb3IgdmFyaW91cyBuZXcgZnVuY3Rpb25zCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnRlc3RGdW5jdGlvbigpIHsKKyAgICAvLyBwcm9kdWNlcyB2YWx1ZXMgKDQ6IDUwMDAwMDApLCAoMTM6IDE4MDAwMDAwKQorICAgIC8vIG5zIHRpbWVzdGFtcHMgb2YgYnVmZmVyIHBlcmlvZHMKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PmtUZW1wVGVzdERhdGEgPSB7MTAwMDAwMCwgNDAwMDAwMCwgNTAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAwMDAsIDE4MDAwMDAwLCAyODAwMDAwMH07CisgICAgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShrVGVtcFRlc3REYXRhKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXI6IG1PdXRsaWVyRGF0YSkgeworICAgICAgICBBTE9HRSgiUGVyZm9ybWFuY2VBbmFseXNpcyB0ZXN0ICVsbGQ6ICVsbGQiLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuZmlyc3QpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuc2Vjb25kKSk7CisgICAgfQorICAgIGRldGVjdFBlYWtzKCk7Cit9CisKKy8vIFRPRE8gTWFrZSBpdCByZXR1cm4gYSBzdGQ6OnN0cmluZyBpbnN0ZWFkIG9mIG1vZGlmeWluZyBib2R5IC0tPiBpcyB0aGlzIHN0aWxsIHJlbGV2YW50PworLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyBhbGwgaW50cyB0byB1aW50MzJfdCBvciB1aW50NjRfdAorLy8gVE9ETzogbW92ZSB0aGlzIHRvIFJlcG9ydFBlcmZvcm1hbmNlLCBwcm9iYWJseSBtYWtlIGl0IGEgZnJpZW5kIGZ1bmN0aW9uIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCkgeworICAgIGlmIChtUmVjZW50SGlzdHMuc2l6ZSgpIDwgMSkgeworICAgICAgICBBTE9HRCgicmVwb3J0UGVyZm9ybWFuY2U6IG1SZWNlbnRIaXN0cyBpcyBlbXB0eSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dEKCJyZXBvcnRQZXJmb3JtYW5jZTogaGlzdHMgc2l6ZSAlZCIsIHN0YXRpY19jYXN0PGludD4obVJlY2VudEhpc3RzLnNpemUoKSkpOworICAgIC8vIFRPRE86IG1vcmUgZWxhYm9yYXRlIGRhdGEgYW5hbHlzaXMKKyAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNob3J0SGlzdDogbVJlY2VudEhpc3RzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY291bnRQYWlyIDogc2hvcnRIaXN0LnNlY29uZCkgeworICAgICAgICAgICAgYnVja2V0c1tjb3VudFBhaXIuZmlyc3RdICs9IGNvdW50UGFpci5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQorICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOworICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7CisgICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7CisKKyAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOworICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKKyAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKKyAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgeworICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgeworICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKKyAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgY29sV2lkdGggPSBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKG1heERlbHRhKSArIDEsIDMpLCBsZWZ0UGFkZGluZyArIDIpOworICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKKyAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKKyAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7CisgICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKKyAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBsZWZ0UGFkZGluZyArIDExLCAiT2NjdXJyZW5jZXMiKTsKKyAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7CisgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7CisgICAgfQorICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgeworICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKKyAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICB9CisgICAgLy8gcHJpbnQgeC1heGlzCisgICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKworICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOworICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOworCisgICAgLy8gTm93IHJlcG9ydCBnbGl0Y2hlcworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG50aW1lIGVsYXBzZWQgYmV0d2VlbiBnbGl0Y2hlcyBhbmQgZ2xpdGNoIHRpbWVzdGFtcHNcbiIpOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllcjogbU91dGxpZXJEYXRhKSB7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJWxsZDogJWxsZFxuIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5zZWNvbmQpKTsKKyAgICB9CisKK30KKworCisvLyBQcm9kdWNlcyBhIGxvZyB3YXJuaW5nIGlmIHRoZSB0aW1pbmcgb2YgcmVjZW50IGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBhIGdsaXRjaAorLy8gQ29tcHV0ZXMgc3VtIG9mIHJ1bm5pbmcgd2luZG93IG9mIHRocmVlIGJ1ZmZlciBwZXJpb2RzCisvLyBDaGVja3Mgd2hldGhlciB0aGUgYnVmZmVyIHBlcmlvZHMgbGVhdmUgZW5vdWdoIENQVSB0aW1lIGZvciB0aGUgbmV4dCBvbmUKKy8vIGUuZy4gaWYgYSBidWZmZXIgcGVyaW9kIGlzIGV4cGVjdGVkIHRvIGJlIDQgbXMgYW5kIGEgYnVmZmVyIHJlcXVpcmVzIDMgbXMgb2YgQ1BVIHRpbWUsCisvLyBoZXJlIGFyZSBzb21lIGdsaXRjaCBjYXNlczoKKy8vIDQgKyA0ICsgNiA7IDUgKyA0ICsgNTsgMiArIDIgKyAxMAorLy8gVE9ETzogZGV2ZWxvcCB0aGlzIGNvZGUgdG8gdHJhY2sgY2hhbmdlcyBpbiBoaXN0b2dyYW0gZGlzdHJpYnV0aW9uIGluIGFkZGl0aW9uCisvLyB0byAvIGluc3RlYWQgb2YgZ2xpdGNoZXMuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKKyAgICBzdGQ6OmRlcXVlPGludD4gcGVyaW9kcyhrTnVtQnVmZiwga1BlcmlvZE1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsgLy8gc2tpcCBmaXJzdCB0aW1lIGVudHJ5CisgICAgICAgIHBlcmlvZHMucHVzaF9mcm9udChkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKSk7CisgICAgICAgIHBlcmlvZHMucG9wX2JhY2soKTsKKyAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCBhbGwgZ2xpdGNoIGNhc2VzIGFyZSBjb3ZlcmVkCisgICAgICAgIGlmIChzdGQ6OmFjY3VtdWxhdGUocGVyaW9kcy5iZWdpbigpLCBwZXJpb2RzLmVuZCgpLCAwKSA+IGtOdW1CdWZmICoga1BlcmlvZE1zICsKKyAgICAgICAgICAgIGtQZXJpb2RNcyAtIGtQZXJpb2RNc0NQVSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOworICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAgYi9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1MGFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmNwcApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJSZXBvcnRQZXJmb3JtYW5jZSIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisvLyAjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+IC8vIHVzZWQgdG8gcHJpbnQgY2FsbHN0YWNrCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKKy8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lIGludGVydmFscyB0byBhIGZpbGUuCisvLyBUT0RPOiBmb3JtYXQgdGhlIGRhdGEgZWZmaWNpZW50bHkgYW5kIHdyaXRlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIHRvIGRpZmZlcmVudCBmaWxlcwordm9pZCB3cml0ZVRvRmlsZShzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhcHBlbmQpIHsKKyAgICBBTE9HRCgid3JpdGluZyBwZXJmb3JtYW5jZSBkYXRhIHRvIGZpbGUiKTsKKyAgICBpZiAob3V0bGllckRhdGEuZW1wdHkoKSB8fCBoaXN0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Om9mc3RyZWFtIG9mczsKKyAgICBvZnMub3BlbihrTmFtZSwgYXBwZW5kID8gc3RkOjppb3M6OmFwcCA6IHN0ZDo6aW9zOjp0cnVuYyk7CisgICAgaWYgKCFvZnMuaXNfb3BlbigpKSB7CisgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuIGZpbGUgJXMiLCBrTmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgb2ZzIDw8ICJPdXRsaWVyIGRhdGE6IGludGVydmFsIGFuZCB0aW1lc3RhbXBcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZvdXRsaWVyIDogb3V0bGllckRhdGEpIHsKKyAgICAgICAgb2ZzIDw8IG91dGxpZXIuZmlyc3QgPDwgIjogIiA8PCBvdXRsaWVyLnNlY29uZCA8PCAiXG4iOworICAgIH0KKyAgICBvZnMgPDwgIkhpc3RvZ3JhbSBkYXRhXG4iOworICAgIGZvciAoY29uc3QgYXV0byAmaGlzdCA6IGhpc3RzKSB7CisgICAgICAgIG9mcyA8PCAiXHR0aW1lc3RhbXBcbiI7CisgICAgICAgIG9mcyA8PCBoaXN0LmZpcnN0IDw8ICJcbiI7CisgICAgICAgIG9mcyA8PCAiXHRidWNrZXRzIGFuZCBjb3VudHNcbiI7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmYnVja2V0IDogaGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIG9mcyA8PCBidWNrZXQuZmlyc3QgPDwgIjogIiA8PCBidWNrZXQuc2Vjb25kIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgb2ZzLmNsb3NlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKaW5kZXggNDc0N2RjZi4uNzExODJiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKQEAgLTE5LDggKzE5LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKaW5kZXggNTA4ZTBmZS4uOGEzZmZiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCmluZGV4IDU2YTJhMzguLjM0OGI0ZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9TdHJlYW1PdXRTaW5rLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fU1RSRUFNX09VVF9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0xpYnNuZGZpbGVTaW5rLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKaW5kZXggOTdhNTdlMC4uNTM1ZTNmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApAQCAtMTcsNyArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU2luayB0aGF0IHdyYXBzIGEgbGlic25kZmlsZSBvcGVuZWQgaW4gU0ZNX1dSSVRFIG1vZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCmluZGV4IDRmYmRiNGIuLmJjNmFhOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCkBAIC0xNyw3ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TT1VSQ0VfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU291cmNlIHRoYXQgd3JhcHMgYSBsaWJzbmRmaWxlIG9wZW5lZCBpbiBTRk1fUkVBRCBtb2RlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CTG9nLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKaW5kZXggNzg1YjljMi4uM2U0OGVlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtNDMsOCArNDQsNiBAQAogY2xhc3MgV3JpdGVyOwogY2xhc3MgUmVhZGVyOwogCi1wcml2YXRlOgotCiBlbnVtIEV2ZW50IDogdWludDhfdCB7CiAgICAgRVZFTlRfUkVTRVJWRUQsCiAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCkBAIC01OSwxMiArNTgsMTMgQEAKICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgogICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KLSAgICBFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICAgICAgLy8gc2hvdyBoaXN0b2dyYW0gb24gbG9nCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIHVwb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkgY2FsbAogICAgIEVWRU5UX0VORF9GTVQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKIAogICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKIH07CiAKK3ByaXZhdGU6CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwpAQCAtMjQ4LDYgKzI0OCw4IEBACiAgICAgaW50IGF1dGhvcjsKIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAordXNpbmcgU3RhdGVUc0VudHJ5V2l0aEF1dGhvciA9IEhpc3RUc0VudHJ5V2l0aEF1dGhvcjsKKwogc3RydWN0IEhpc3RJbnRFbnRyeSB7CiAgICAgbG9nX2hhc2hfdCBoYXNoOwogICAgIGludCB2YWx1ZTsKQEAgLTM0MSw4ICszNDMsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFbmQoKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIaXN0VFMobG9nX2hhc2hfdCBoYXNoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCk7CisgICAgdmlydHVhbCB2b2lkICAgIGxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpOwogCiAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwogCkBAIC00MDcsNiArNDA4LDcgQEAKIHB1YmxpYzoKIAogICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorICAgIC8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKICAgICBjbGFzcyBTbmFwc2hvdCB7CiAgICAgcHVibGljOgogICAgICAgICBTbmFwc2hvdCgpIDogbURhdGEoTlVMTCksIG1Mb3N0KDApIHt9CkBAIC00NDMsMjAgKzQ0NSwxNyBAQAogCiAgICAgdmlydHVhbCB+UmVhZGVyKCk7CiAKLSAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpOwotCiAgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCiAgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdCgpOwogICAgIC8vIGR1bXAgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKKyAgICAvLyBUT0RPOiBtb3ZlIGR1bXAgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4gTW9kZWwvdmlldy9jb250cm9sbGVyIGRlc2lnbgogICAgIHZvaWQgICAgIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBTbmFwc2hvdCAmIHNuYXApOwogICAgIC8vIGR1bXAgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIChjYWxsIGdldFNuYXBzaG90KCkgYW5kIHByZXZpb3VzIGR1bXAoKSkKICAgICB2b2lkICAgICBkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCA9IDApOwogICAgIGJvb2wgICAgIGlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3Q7Ci0gICAgLy8gaWYgZmluZEdsaXRjaCBpcyB0cnVlLCBsb2cgd2FybmluZyB3aGVuIGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBnbGl0Y2gKLSAgICB2b2lkICAgICBzZXRGaW5kR2xpdGNoKGJvb2wgcyk7Ci0gICAgYm9vbCAgICAgaXNGaW5kR2xpdGNoKCkgY29uc3Q7CiAKIHByaXZhdGU6CisKICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7CiAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBlbmRpbmdUeXBlczsKICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90CkBAIC00NjksMTAgKzQ2OCw2IEBACiAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKIAotICAgIC8vIGVhY2ggcGFpciBjb250YWlucyBhIHNlcXVlbmNlIG9mIHRpbWVzdGFtcHMgKG9uZSBoaXN0b2dyYW0ncyB3b3J0aCkKLSAgICAvLyBwYWlyJ3MgbG9nX2hhc2hfdCBpcyB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRpbWVzdGFtcCB3YXMgdGFrZW4KLSAgICAvLyBwYWlyJ3MgaW50IHBvaW50cyB0byB0aGUgUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8bG9nX2hhc2hfdCwgaW50Piwgc3RkOjp2ZWN0b3I8aW50NjRfdD4+IG1IaXN0czsKICAgICAvLyBUT0RPOiBpdCBtaWdodCBiZSBjbGVhcmVyLCBpbnN0ZWFkIG9mIGEgZGlyZWN0IG1hcCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byB2ZWN0b3Igb2YKICAgICAvLyB0aW1lc3RhbXBzLCBpZiB3ZSBpbnN0ZWFkIGZpcnN0IG1hcHBlZCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byBhbiBvYmplY3QgdGhhdAogICAgIC8vIHJlcHJlc2VudGVkIHRoYXQgbG9jYXRpb24uIEFuZCBvbmVfb2YgaXRzIGZpZWxkcyB3b3VsZCBiZSBhIHZlY3RvciBvZiB0aW1lc3RhbXBzLgpAQCAtNDg1LDE3ICs0ODAsMTIgQEAKICAgICAvLyBkdW1teSBtZXRob2QgZm9yIGhhbmRsaW5nIGFic2VudCBhdXRob3IgZW50cnkKICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9CiAKLSAgICBzdGF0aWMgdm9pZCBkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwgaW50IGluZGVudCA9IDAsIGludCBtYXhIZWlnaHQgPSAxMCk7Ci0KICAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgZW50cnkgb2YgdHlwZSA8dHlwZT4gaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKICAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCi0KLSAgICBib29sIGZpbmRHbGl0Y2g7IC8vIGFsZXJ0IGlmIGEgbG9jYWwgYnVmZmVyIHBlcmlvZCBzZXF1ZW5jZSBjYXVzZWQgYW4gYXVkaW8gZ2xpdGNoCiB9OwogCiAvLyBXcmFwcGVyIGZvciBhIHJlYWRlciB3aXRoIGEgbmFtZS4gQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSByZWFkZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmFtZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRjMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBOb24tYmxvY2tpbmcgZXZlbnQgbG9nZ2VyIGludGVuZGVkIGZvciBzYWZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgdmlhIHNoYXJlZCBtZW1vcnkKKworI2lmbmRlZiBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJOQkxvZy5oIgorI2luY2x1ZGUgIlJlcG9ydFBlcmZvcm1hbmNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKKworY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcyB7CisgICAgLy8gVGhpcyBjbGFzcyBzdG9yZXMgYW5kIGFuYWx5emVzIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMgZnJvbSBOQkxvZworICAgIC8vIEZJWE1FOiBjdXJyZW50bHksIGFsbCBwZXJmb3JtYW5jZSBkYXRhIGlzIHN0b3JlZCBpbiBkZXF1ZXMuIE5lZWQgdG8gYWRkIGEgbXV0ZXguCisgICAgLy8gRklYTUU6IGNvbnRpbnVlIHRoaXMgd2F5IHVudGlsIGFuYWx5c2lzIGlzIGRvbmUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIFRoZW4sIHVzZQorICAgIC8vIHRoZSBmaWZvIHdyaXRlciB1dGlsaXRpZXMuCitwdWJsaWM6CisKKyAgICBQZXJmb3JtYW5jZUFuYWx5c2lzKCk7CisKKyAgICAvLyBHaXZlbiBhIHNlcmllcyBvZiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXBzLAorICAgIC8vIGNvbXByZXNzZXMgYW5kIGFuZCBhbmFseXplcyB0aGUgZGF0YSwgYW5kIGZsdXNoZXMKKyAgICAvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KKyAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYW4gYXVkaW8gb24vb2ZmIGV2ZW50IGlzIHJlYWQgZnJvbSB0aGUgYnVmZmVyLAorICAgIC8vIGUuZy4gRVZFTlRfQVVESU9fU1RBVEUuCisgICAgLy8gY2FsbHMgZmx1c2hUaW1lU3RhbXBTZXJpZXMgb24gdGhlIGRhdGEgdXAgdG8gdGhlIGV2ZW50LAorICAgIC8vIGVmZmVjdGl2ZWx5IGRpc2NhcmRpbmcgdGhlIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAorICAgIHZvaWQgaGFuZGxlU3RhdGVDaGFuZ2UoKTsKKworICAgIC8vIFdoZW4gdGhlIHNob3J0LXRlcm0gaGlzdG9ncmFtIGFycmF5IG1SZWNlbnRIaXN0cyBoYXMgcmVhY2hlZCBjYXBhY2l0eSwKKyAgICAvLyBtZXJnZXMgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmVzIHRoZW0gaW4gbUxvbmdUZXJtSGlzdHMKKyAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFJlY2VudEhpc3RzKCk7CisKKyAgICAvLyBXcml0ZXMgd2FrZXVwIHRpbWVzdGFtcCBlbnRyeSB0byBsb2cgYW5kIHJ1bnMgYW5hbHlzaXMKKyAgICAvLyBUT0RPOiBtYWtlIHRoaXMgdGhyZWFkIHNhZmUuIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24gaW5zdGFuY2UKKyAgICAvLyBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzLgorICAgIHZvaWQgbG9nVHNFbnRyeSh0aW1lc3RhbXBfcmF3IHRzKTsKKworICAgIC8vIEZJWE1FOiBtYWtlIHBlYWtkZXRlY3RvciBhbmQgc3RvcmVPdXRsaWVyRGF0YSBhIHNpbmdsZSBmdW5jdGlvbgorICAgIC8vIElucHV0OiBtT3V0bGllckRhdGEuIExvb2tzIGF0IHRpbWUgZWxhcHNlZCBiZXR3ZWVuIG91dGxpZXJzCisgICAgLy8gZmluZHMgc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiB0aGUgZGlzdHJpYnV0aW9uCisgICAgLy8gd3JpdGVzIHRpbWVzdGFtcHMgb2Ygc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBtUGVha1RpbWVzdGFtcHMKKyAgICB2b2lkIGRldGVjdFBlYWtzKCk7CisKKyAgICAvLyBydW5zIGFuYWx5c2lzIG9uIHRpbWVzdGFtcCBzZXJpZXMgYmVmb3JlIGl0IGlzIGNvbnZlcnRlZCB0byBhIGhpc3RvZ3JhbQorICAgIC8vIGZpbmRzIG91dGxpZXJzCisgICAgLy8gd3JpdGVzIHRvIG1PdXRsaWVyRGF0YSA8dGltZSBlbGFwc2VkIHNpbmNlIHByZXZpb3VzIG91dGxpZXIsIG91dGxpZXIgdGltZXN0YW1wPgorICAgIHZvaWQgc3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3Rvcjx0aW1lc3RhbXBfcmF3PiAmdGltZXN0YW1wcyk7CisKKyAgICAvLyBpbnB1dDogc2VyaWVzIG9mIHNob3J0IGhpc3RvZ3JhbXMuIEdlbmVyYXRlcyBhIHN0cmluZyBvZiBhbmFseXNpcyBvZiB0aGUgYnVmZmVyIHBlcmlvZHMKKyAgICAvLyBUT0RPOiBXSVAgd3JpdGUgbW9yZSBkZXRhaWxlZCBhbmFseXNpcworICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgZGF0YSB2aXN1YWxpemF0aW9uIHRvIGEgc2VwYXJhdGUgY2xhc3MuIE1vZGVsL3ZpZXcvY29udHJvbGxlcgorICAgIHZvaWQgcmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCA9IDEwKTsKKworICAgIC8vIFRPRE86IGRlbGV0ZSB0aGlzLiB0ZW1wIGZvciB0ZXN0aW5nCisgICAgdm9pZCB0ZXN0RnVuY3Rpb24oKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlZCB0byBkZXRlY3QgZ2xpdGNoZXMgaW4gYSB0aW1lIHNlcmllcworICAgIC8vIFRPRE8gaW5jb3Jwb3JhdGUgdGhpcyBpbnRvIHRoZSBhbmFseXNpcyAoY3VycmVudGx5IHVudXNlZCkKKyAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8dGltZXN0YW1wX3Jhdz4gJnNhbXBsZXMpOworCitwcml2YXRlOgorCisgICAgLy8gc3RvcmVzIG91dGxpZXIgYW5hbHlzaXM6IDxlbGFwc2VkIHRpbWUgYmV0d2VlbiBvdXRsaWVycyBpbiBtcywgb3V0bGllciB0aW1lc3RhbXA+CisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8b3V0bGllckludGVydmFsLCB0aW1lc3RhbXA+PiBtT3V0bGllckRhdGE7CisKKyAgICAvLyBzdG9yZXMgZWFjaCB0aW1lc3RhbXAgYXQgd2hpY2ggYSBwZWFrIHdhcyBkZXRlY3RlZAorICAgIC8vIGEgcGVhayBpcyBhIG1vbWVudCBhdCB3aGljaCB0aGUgYXZlcmFnZSBvdXRsaWVyIGludGVydmFsIGNoYW5nZWQgc2lnbmlmaWNhbnRseQorICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CisKKyAgICAvLyBUT0RPOiB0dXJuIHRoZXNlIGludG8gY2lyY3VsYXIgYnVmZmVycyBmb3IgYmV0dGVyIGRhdGEgZmxvdworICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIHNob3J0IGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1SZWNlbnRIaXN0czsKKworICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIGxvbmctdGVybSBidWZmZXIgcGVyaW9kIGhpc3RvZ3JhbXMgd2l0aCB0aW1lc3RhbXAgb2YgZmlyc3Qgc2FtcGxlCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiBtTG9uZ1Rlcm1IaXN0czsKKworICAgIC8vIHZlY3RvciBvZiB0aW1lc3RhbXBzLCBjb2xsZWN0ZWQgZnJvbSBOQkxvZyBmb3IgYSAoVE9ETykgc3BlY2lmaWMgdGhyZWFkCisgICAgLy8gd2hlbiBhIHZlY3RvciByZWFjaGVzIGl0cyBtYXhpbXVtIHNpemUsIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBhbmQgZmx1c2hlZAorICAgIHN0ZDo6dmVjdG9yPHRpbWVzdGFtcF9yYXc+IG1UaW1lU3RhbXBTZXJpZXM7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNc1BlclNlYyA9IDEwMDA7CisKKyAgICAvLyBQYXJhbWV0ZXJzIHVzZWQgd2hlbiBkZXRlY3Rpbmcgb3V0bGllcnMKKyAgICAvLyBUT0RPOiBsZWFybiBzb21lIG9mIHRoZXNlIGZyb20gdGhlIGRhdGEsIGRlbGV0ZSB1bnVzZWQgb25lcworICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBtYWtlIGtQZXJpb2RNcyBzdGF0aWMuCisgICAgc3RhdGljIGNvbnN0IGludCBrTnVtQnVmZiA9IDM7IC8vIG51bWJlciBvZiBidWZmZXJzIGNvbnNpZGVyZWQgaW4gbG9jYWwgaGlzdG9yeQorICAgIGludCBrUGVyaW9kTXM7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKKyAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyTXMgPSA3OyAvLyB2YWx1ZXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzIGNhdXNlIGdsaXRjaGVzCisgICAgLy8gREFDIHByb2Nlc3NpbmcgdGltZSBmb3IgNCBtcyBidWZmZXIKKyAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUmF0aW8gPSAwLjc1OyAvLyBlc3RpbWF0ZSBvZiBDUFUgdGltZSBhcyByYXRpbyBvZiBwZXJpb2QgbGVuZ3RoCisgICAgaW50IGtQZXJpb2RNc0NQVTsgLy8gY29tcHV0ZSBiYXNlZCBvbiBrUGVyaW9kTGVuIGFuZCBrUmF0aW8KKworICAgIC8vIFBlYWsgZGV0ZWN0aW9uOiBudW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIG1lYW4gY29uc2lkZXJlZCBhIHNpZ25pZmljYW50IGNoYW5nZQorICAgIHN0YXRpYyBjb25zdCBpbnQga1N0ZGRldlRocmVzaG9sZCA9IDU7CisKKyAgICAvLyBjYXBhY2l0eSBhbGxvY2F0ZWQgdG8gZGF0YSBzdHJ1Y3R1cmVzCisgICAgLy8gVE9ETzogYWRqdXN0IGFsbCBvZiB0aGVzZSB2YWx1ZXMKKyAgICBzdGF0aWMgY29uc3QgaW50IGtSZWNlbnRIaXN0c0NhcGFjaXR5ID0gMTAwOyAvLyBudW1iZXIgb2Ygc2hvcnQtdGVybSBoaXN0b2dyYW1zIHN0b3JlZCBpbiBtZW1vcnkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTaG9ydEhpc3RTaXplID0gNTA7IC8vIG51bWJlciBvZiBzYW1wbGVzIGluIGEgc2hvcnQtdGVybSBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyU2VyaWVzU2l6ZSA9IDEwMDsgLy8gbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgaW4gb3V0bGllciBhcnJheQorICAgIHN0YXRpYyBjb25zdCBpbnQga1BlYWtTZXJpZXNTaXplID0gMTAwOyAvLyBudW1iZXIgb2YgdmFsdWVzIHN0b3JlZCBpbiBwZWFrIGFycmF5CisgICAgc3RhdGljIGNvbnN0IGludCBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5ID0gMjA7IC8vIG51bWJlciBvZiBsb25nLXRlcm0gaGlzdG9ncmFtIHN0b3JlZCBpbiBtZW1vcnkKKyAgICAvLyBtYXhpbXVtIGVsYXBzZWQgdGltZSBiZXR3ZWVuIGZpcnN0IGFuZCBsYXN0IHRpbWVzdGFtcCBvZiBhIGxvbmctdGVybSBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhIaXN0VGltZXNwYW5NcyA9IDUgKiBrTXNQZXJTZWM7CisKKyAgICAvLyB0aGVzZSB2YXJpYWJsZXMgYXJlIHN0b3JlZCBpbi1jbGFzcyB0byBlbnN1cmUgY29udGludWl0eSB3aGlsZSBhbmFseXppbmcgdGhlIHRpbWVzdGFtcAorICAgIC8vIHNlcmllcyBvbmUgc2hvcnQgc2VxdWVuY2UgYXQgYSB0aW1lOiB0aGUgdmFyaWFibGVzIGFyZSBub3QgcmUtaW5pdGlhbGl6ZWQgZXZlcnkgdGltZS4KKyAgICAvLyBGSVhNRTogY3JlYXRlIGlubmVyIGNsYXNzIGZvciB0aGVzZSB2YXJpYWJsZXMgYW5kIGRlY2lkZSB3aGljaCBvdGhlciBvbmVzIHRvIGFkZCB0byBpdAorICAgIGRvdWJsZSBtUGVha0RldGVjdG9yTWVhbiA9IC0xOworICAgIGRvdWJsZSBtUGVha0RldGVjdG9yU2QgPSAtMTsKKyAgICAvLyB2YXJpYWJsZXMgZm9yIHN0b3JlT3V0bGllckRhdGEKKyAgICB1aW50NjRfdCBtRWxhcHNlZCA9IDA7CisgICAgaW50NjRfdCBtUHJldk5zID0gLTE7CisKK307CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZS5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAppbmRleCA1OGI5NzUwLi4wNDMxOTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPX1BJUEVfSAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QyODEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCisvLyBUT0RPIG1vdmUgcmVwb3J0UGVyZm9ybWFuY2UgZnVuY3Rpb24gdG8gUmVwb3J0UGVyZm9ybWFuY2UuY3BwCitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgeworCisvLyBzdG9yZXMgYSBoaXN0b2dyYW06IGtleTogb2JzZXJ2ZWQgYnVmZmVyIHBlcmlvZC4gdmFsdWU6IGNvdW50CisvLyBUT0RPOiB1bnNpZ25lZCwgdW5zaWduZWQKK3VzaW5nIEhpc3RvZ3JhbSA9IHN0ZDo6bWFwPGludCwgaW50PjsKKwordXNpbmcgb3V0bGllckludGVydmFsID0gdWludDY0X3Q7CisvLyBpbnQ2NF90IHRpbWVzdGFtcHMgYXJlIGNvbnZlcnRlZCB0byB1aW50NjRfdCBpbiBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhLAorLy8gYW5kIGFsbCBhbmFseXNpcyBmdW5jdGlvbnMgdXNlIHVpbnQ2NF90LgordXNpbmcgdGltZXN0YW1wID0gdWludDY0X3Q7Cit1c2luZyB0aW1lc3RhbXBfcmF3ID0gaW50NjRfdDsKKworLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIHVzZSA2NCBvciAzMiBiaXRzCisvLyBUT0RPOiB0aGUgY29kZSBoYXMgYSBtaXggb2YgdHlwZWRlZiBhbmQgdXNpbmcuIFN0YW5kYXJkaXplIHRvIG9uZSBvciB0aGUgb3RoZXIuCit0eXBlZGVmIHVpbnQ2NF90IGxvZ19oYXNoX3Q7CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7CisgICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBsb2cyKHVpbnQzMl90IHgpIHsKKyAgICAvLyBUaGlzIHdvcmtzIGZvciB4ID4gMAorICAgIHJldHVybiAzMSAtIF9fYnVpbHRpbl9jbHooeCk7Cit9CisKKy8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lCisvLyBpbnRlcnZhbHMgdG8gYSBmaWxlLgordm9pZCB3cml0ZVRvRmlsZShzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKKyAgICAgICAgICAgICAgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBrTmFtZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBhcHBlbmQpOworCit9IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGFlNDk5MDMuLmNjMmQwMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaWZuZGVmIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAjZGVmaW5lIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKaW5kZXggNjBhZTkyZS4uYzUxZDBmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmg+Ci0jaW5jbHVkZSAiTkJBSU8uaCIKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL01vbm9QaXBlUmVhZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CQUlPLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkFJTy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggMWY5OGU4ZC4uZDRlYzMwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC00OSwxOCArNDksMTggQEAKIAogI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgogCi0jaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+Ci0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0FzU3RyaW5nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogI2luY2x1ZGUgImluY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oIgogI2luY2x1ZGUgImluY2x1ZGUvRGF0YUNvbnZlcnRlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2VjdXJlQnVmZmVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9TaGFyZWRNZW1vcnlCdWZmZXIuaCIKLSNpbmNsdWRlICJvbXgvT01YVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CkBAIC00ODQzLDkgKzQ4NDMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCA8IDAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggPiB2aWRlb0RlZi0+bkZyYW1lV2lkdGggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQgPiB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIldyb25nIGNyb3BwZWQgcmVjdCAoJWQsICVkKSAtICgldSwgJXUpIHZzLiBmcmFtZSAoJXUsICV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIldyb25nIGNyb3BwZWQgcmVjdCAoJWQsICVkLCAldSwgJXUpIHZzLiBmcmFtZSAoJXUsICV1KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LCByZWN0Lm5Ub3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGgsIHJlY3QublRvcCArIHJlY3QubkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubldpZHRoLCByZWN0Lm5IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0RlZi0+bkZyYW1lV2lkdGgsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCmluZGV4IDBkOTY5NmYuLjNjN2FlM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxudW1lcmljPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMzQsOCArMzQsMTEgQEAKICNpbmNsdWRlICJpbmNsdWRlL1NoYXJlZE1lbW9yeUJ1ZmZlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXVzaW5nIE1lZGlhRGVzY3JhbWJsZXI6OkRlc2NyYW1ibGVJbmZvOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwogdXNpbmcgQnVmZmVySW5mbyA9IEFDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlckluZm87CiB1c2luZyBCdWZmZXJJbmZvSXRlcmF0b3IgPSBzdGQ6OnZlY3Rvcjxjb25zdCBCdWZmZXJJbmZvPjo6Y29uc3RfaXRlcmF0b3I7CiAKQEAgLTExNCw3NCArMTE3LDk3IEBACiAgICAgICAgIHJldHVybiAtRU5PRU5UOwogICAgIH0KIAotICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2VjdXJlSGFuZGxlID0gTlVMTDsKICAgICBpZiAoc2VjdXJlKSB7CiAgICAgICAgIHNwPFNlY3VyZUJ1ZmZlcj4gc2VjdXJlRGF0YSA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2VjdXJlQnVmZmVyICo+KGl0LT5tQ29kZWNCdWZmZXIuZ2V0KCkpOwotICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IHNlY3VyZURhdGEtPmdldERlc3RpbmF0aW9uVHlwZSgpOwotICAgICAgICBpZiAoZGVzdGluYXRpb24ubVR5cGUgIT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZSkgeworICAgICAgICBpZiAoc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25UeXBlKCkgIT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZSkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBkZXN0aW5hdGlvbi5tSGFuZGxlID0KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25Qb2ludGVyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeTsKLSAgICAgICAgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeSA9IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgICAgIHNlY3VyZUhhbmRsZSA9IHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7CiAgICAgfQotCi0gICAgSUNyeXB0bzo6U291cmNlQnVmZmVyIHNvdXJjZTsKLSAgICBzb3VyY2UubVNoYXJlZE1lbW9yeSA9IGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyOwotICAgIHNvdXJjZS5tSGVhcFNlcU51bSA9IG1IZWFwU2VxTnVtOwotCiAgICAgc3NpemVfdCByZXN1bHQgPSAtMTsKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tSGFuZGxlID0gc2VjdXJlSGFuZGxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5OworICAgICAgICAgICAgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeSA9IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgICAgIH0KKworICAgICAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOworICAgICAgICBzb3VyY2UubVNoYXJlZE1lbW9yeSA9IGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyOworICAgICAgICBzb3VyY2UubUhlYXBTZXFOdW0gPSBtSGVhcFNlcU51bTsKKwogICAgICAgICByZXN1bHQgPSBtQ3J5cHRvLT5kZWNyeXB0KGtleSwgaXYsIG1vZGUsIHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgc291cmNlLCBpdC0+bUNsaWVudEJ1ZmZlci0+b2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZGVzdGluYXRpb24sIGVycm9yRGV0YWlsTXNnKTsKLSAgICB9IGVsc2UgewotICAgICAgICBEZXNjcmFtYmxlSW5mbyBkZXNjcmFtYmxlSW5mbzsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uZHN0VHlwZSA9IGRlc3RpbmF0aW9uLm1UeXBlID09Ci0gICAgICAgICAgICAgICAgSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSA/Ci0gICAgICAgICAgICAgICAgRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIgOgotICAgICAgICAgICAgICAgIERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zY3JhbWJsaW5nQ29udHJvbCA9IGtleSAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAoRGVzY3JhbWJsZXJQbHVnaW46OlNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6Ci0gICAgICAgICAgICAgICAgRGVzY3JhbWJsZXJQbHVnaW46OmtTY3JhbWJsaW5nX1Vuc2NyYW1ibGVkOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5udW1TdWJTYW1wbGVzID0gbnVtU3ViU2FtcGxlczsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc3ViU2FtcGxlcyA9IChEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlICopc3ViU2FtcGxlczsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc3JjTWVtID0gaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXI7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLnNyY09mZnNldCA9IDA7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLmRzdFB0ciA9IE5VTEw7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLmRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgaW50MzJfdCBkZXNjcmFtYmxlUmVzdWx0ID0gLTE7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoZGVzY3JhbWJsZUluZm8sICZkZXNjcmFtYmxlUmVzdWx0KTsKLQotICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gZGVzY3JhbWJsZVJlc3VsdDsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGVzY3JhbWJsZSBmYWlsZWQsIGV4Y2VwdGlvbkNvZGU9JWQsIGVycj0lZCwgcmVzdWx0PSV6ZCIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCksIHJlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsIHJlc3VsdD0lemQiLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChyZXN1bHQgPiAwICYmIGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKLSAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5LT5wb2ludGVyKCksCisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7CisgICAgICAgICAgICBtZW1jcHkoaXQtPm1Db2RlY0J1ZmZlci0+YmFzZSgpLCBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5LT5wb2ludGVyKCksIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBIZXJlIHdlIGNhc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgdG8gaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTdWJTYW1wbGUKKyAgICAgICAgLy8gZGlyZWN0bHksIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIGFzIGNoZWNrZWQgaW4gRGVzY3JhbWJsZXJJbXBsLmNwcC4KKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBoaWRsU3ViU2FtcGxlczsKKyAgICAgICAgaGlkbFN1YlNhbXBsZXMuc2V0VG9FeHRlcm5hbCgoU3ViU2FtcGxlICopc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZmFsc2UgLypvd24qLyk7CisKKyAgICAgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlci0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKKyAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgc3JjQnVmZmVyID0geworICAgICAgICAgICAgICAgIC5oZWFwQmFzZSA9IG1IaWRsTWVtb3J5LAorICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAodWludDY0X3QpIG9mZnNldCwKKyAgICAgICAgICAgICAgICAuc2l6ZSA9IHNpemUKKyAgICAgICAgfTsKKworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5zZWN1cmVNZW1vcnkgPSBoaWRsX2hhbmRsZShzZWN1cmVIYW5kbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZOworICAgICAgICAgICAgZHN0QnVmZmVyLm5vbnNlY3VyZU1lbW9yeSA9IHNyY0J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOworCisgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKKyAgICAgICAgICAgICAgICBrZXkgIT0gTlVMTCA/IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF0gOiBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQsCisgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZyZXN1bHQsICZkZXRhaWxlZEVycm9yXSAoCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfc3RhdHVzOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoc3NpemVfdClfYnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpPSyB8fCByZXN1bHQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQsIHJlc3VsdD0lemQiLAorICAgICAgICAgICAgICAgICAgICByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIHJlc3VsdCk7CisKKyAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgICAgIG1lbWNweShpdC0+bUNvZGVjQnVmZmVyLT5iYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlci0+cG9pbnRlcigpLCByZXN1bHQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBpZiAoZGVzdGluYXRpb24ubVR5cGUgPT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSkgewotICAgICAgICBtZW1jcHkoaXQtPm1Db2RlY0J1ZmZlci0+YmFzZSgpLCBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5LT5wb2ludGVyKCksIHJlc3VsdCk7Ci0gICAgfQotCiAgICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgcmVzdWx0KTsKIAogICAgIC8vIENvcHkgbWV0YWRhdGEgZnJvbSBjbGllbnQgdG8gY29kZWMgYnVmZmVyLgpAQCAtMjc1LDEwICszMDEsMjEgQEAKICAgICAgICAgaW50MzJfdCBzZXFOdW0gPSBtQ3J5cHRvLT5zZXRIZWFwKGRlYWxlci0+Z2V0TWVtb3J5SGVhcCgpKTsKICAgICAgICAgaWYgKHNlcU51bSA+PSAwKSB7CiAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IHNlcU51bTsKLSAgICAgICAgICAgIEFMT0dEKCJzZXRIZWFwIHJldHVybmVkIG1IZWFwU2VxTnVtPSVkIiwgbUhlYXBTZXFOdW0pOworICAgICAgICAgICAgQUxPR1YoInNldEhlYXAgcmV0dXJuZWQgbUhlYXBTZXFOdW09JWQiLCBtSGVhcFNlcU51bSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IC0xOwotICAgICAgICAgICAgQUxPR0QoInNldEhlYXAgZmFpbGVkLCBzZXR0aW5nIG1IZWFwU2VxTnVtPS0xIik7CisgICAgICAgICAgICBBTE9HRSgic2V0SGVhcCBmYWlsZWQsIHNldHRpbmcgbUhlYXBTZXFOdW09LTEiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobURlc2NyYW1ibGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBkZWFsZXItPmdldE1lbW9yeUhlYXAoKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKG5hdGl2ZUhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbnQgZmQgPSBoZWFwLT5nZXRIZWFwSUQoKTsKKyAgICAgICAgICAgIG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgICAgICAgICAgbUhpZGxNZW1vcnkgPSBoaWRsX21lbW9yeSgiYXNobWVtIiwgaGlkbF9oYW5kbGUobmF0aXZlSGFuZGxlKSwgaGVhcC0+Z2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVkIGhpZGxfbWVtb3J5IGZvciBkZXNjcmFtYmxlciIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjcmVhdGUgaGlkbF9tZW1vcnkgZm9yIGRlc2NyYW1ibGVyIik7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGRlYWxlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IDZjYzFhY2UuLjE5OTczYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsNyBAQAogICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKICAgICAgICAgIkF1ZGlvU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJJbXBsLmNwcCIsCisgICAgICAgICJDb2RlY0Jhc2UuY3BwIiwKICAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIiwKQEAgLTY3LDExICs2OCw2IEBACiAgICAgICAgICJhdmNfdXRpbHMuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSIsCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmJpbmRlciIsCkBAIC05OCwxNCArOTQsMTcgQEAKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYlJTY3BwIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC0xNzMsNCArMTcyLDUgQEAKICAgICAidGltZWR0ZXh0IiwKICAgICAid2VibSIsCiAgICAgIndpZmktZGlzcGxheSIsCisgICAgInhtbHBhcnNlciIsCiBdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYxMGIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjQmFzZSIKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgQnVmZmVyQ2hhbm5lbEJhc2U6OnNldENyeXB0byhjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvKSB7CisgICAgbUNyeXB0byA9IGNyeXB0bzsKK30KKwordm9pZCBCdWZmZXJDaGFubmVsQmFzZTo6c2V0RGVzY3JhbWJsZXIoY29uc3Qgc3A8SURlc2NyYW1ibGVyPiAmZGVzY3JhbWJsZXIpIHsKKyAgICBtRGVzY3JhbWJsZXIgPSBkZXNjcmFtYmxlcjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAKaW5kZXggOTE3ODcwZi4uMWFhM2JhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwCkBAIC04OCw3ICs4OCw5IEBACiAKIHN0YXR1c190IEZyYW1lUmVuZGVyVHJhY2tlcjo6b25GcmFtZVJlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3Qgc3lzdGVtTmFubykgewogICAgIC8vIGVuc3VyZSBtb25vdG9uaWMgdGltZXN0YW1wcwotICAgIGlmIChtTGFzdFJlbmRlclRpbWVOcyA+PSBzeXN0ZW1OYW5vKSB7CisgICAgaWYgKG1MYXN0UmVuZGVyVGltZU5zID4gc3lzdGVtTmFubyB8fAorICAgICAgICAvLyBFT1MgaXMgbm9ybWFsbHkgbWFya2VkIG9uIHRoZSBsYXN0IGZyYW1lCisgICAgICAgIChtTGFzdFJlbmRlclRpbWVOcyA9PSBzeXN0ZW1OYW5vICYmIG1lZGlhVGltZVVzICE9IElOVDY0X01BWCkpIHsKICAgICAgICAgQUxPR1coIlslc10gSWdub3Jpbmcgb3V0IG9mIG9yZGVyL3N0YWxlIHN5c3RlbSBuYW5vICVsbGQgZm9yIG1lZGlhIHRpbWUgJWxsZCBmcm9tIGNvZGVjLiIsCiAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZylzeXN0ZW1OYW5vLCAobG9uZyBsb25nKW1lZGlhVGltZVVzKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCBlY2Q2MmIwLi45NDFjNzU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMTc3MCwzNSArMTc3MSw0OSBAQAogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKLSAgICAgICAgICAgIC8vIEJlc3QgY2FzZSB0aGUgdG90YWwgZGF0YSBsZW5ndGggaW5zaWRlICJceEE5eHl6IiBib3gKLSAgICAgICAgICAgIC8vIHdvdWxkIGJlIDgsIGZvciBpbnN0YW5jZSAiXHhBOXh5eiIgKyAiXHgwMFx4MDRceDE1XHhjNyIgKyAiMCswLyIsCi0gICAgICAgICAgICAvLyB3aGVyZSAiXHgwMFx4MDQiIGlzIHRoZSB0ZXh0IHN0cmluZyBsZW5ndGggd2l0aCB2YWx1ZSA9IDQsCi0gICAgICAgICAgICAvLyAiXDB4MTVceGM3IiBpcyB0aGUgbGFuZ3VhZ2UgY29kZSA9IGVuLCBhbmQgIjArMCIgaXMgYQorICAgICAgICAgICAgLy8gQmVzdCBjYXNlIHRoZSB0b3RhbCBkYXRhIGxlbmd0aCBpbnNpZGUgIlx4QTl4eXoiIGJveCB3b3VsZAorICAgICAgICAgICAgLy8gYmUgOSwgZm9yIGluc3RhbmNlICJceEE5eHl6IiArICJceDAwXHgwNVx4MTVceGM3IiArICIrMCswLyIsCisgICAgICAgICAgICAvLyB3aGVyZSAiXHgwMFx4MDUiIGlzIHRoZSB0ZXh0IHN0cmluZyBsZW5ndGggd2l0aCB2YWx1ZSA9IDUsCisgICAgICAgICAgICAvLyAiXDB4MTVceGM3IiBpcyB0aGUgbGFuZ3VhZ2UgY29kZSA9IGVuLCBhbmQgIiswKzAvIiBpcyBhCiAgICAgICAgICAgICAvLyBsb2NhdGlvbiAoc3RyaW5nKSB2YWx1ZSB3aXRoIGxvbmdpdHVkZSA9IDAgYW5kIGxhdGl0dWRlID0gMC4KLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA4KSB7CisgICAgICAgICAgICAvLyBTaW5jZSBzb21lIGRldmljZXMgZW5jb3VudGVyZWQgaW4gdGhlIHdpbGQgb21pdCB0aGUgdHJhaWxpbmcKKyAgICAgICAgICAgIC8vIHNsYXNoLCB3ZSdsbCBhbGxvdyB0aGF0LgorICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDgpIHsgLy8gOCBpbnN0ZWFkIG9mIDkgdG8gYWxsb3cgZm9yIG1pc3NpbmcgLwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFdvcnN0IGNhc2UgdGhlIGxvY2F0aW9uIHN0cmluZyBsZW5ndGggd291bGQgYmUgMTgsCi0gICAgICAgICAgICAvLyBmb3IgaW5zdGFuY2UgKzkwLjAwMDAtMTgwLjAwMDAsIHdpdGhvdXQgdGhlIHRyYWlsaW5nICIvIiBhbmQKLSAgICAgICAgICAgIC8vIHRoZSBzdHJpbmcgbGVuZ3RoICsgbGFuZ3VhZ2UgY29kZSwgYW5kIHNvbWUgZGV2aWNlcyBpbmNsdWRlCi0gICAgICAgICAgICAvLyBhbiBhZGRpdGlvbmFsIDggYnl0ZXMgb2YgYWx0aXR1ZGUsIGUuZy4gKzAwNy4xODYKLSAgICAgICAgICAgIGNoYXIgYnVmZmVyWzE4ICsgOF07Ci0KLSAgICAgICAgICAgIC8vIFN1YnN0cmFjdGluZyA1IGZyb20gdGhlIGRhdGEgc2l6ZSBpcyBiZWNhdXNlIHRoZSB0ZXh0IHN0cmluZyBsZW5ndGggKwotICAgICAgICAgICAgLy8gbGFuZ3VhZ2UgY29kZSB0YWtlcyA0IGJ5dGVzLCBhbmQgdGhlIHRyYWlsaW5nIHNsYXNoICIvIiB0YWtlcyAxIGJ5dGUuCi0gICAgICAgICAgICBvZmY2NF90IGxvY2F0aW9uX2xlbmd0aCA9IGNodW5rX2RhdGFfc2l6ZSAtIDU7Ci0gICAgICAgICAgICBpZiAobG9jYXRpb25fbGVuZ3RoID49IChvZmY2NF90KSBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKyA0LCBidWZmZXIsIGxvY2F0aW9uX2xlbmd0aCkgPCBsb2NhdGlvbl9sZW5ndGgpIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlbjsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihkYXRhX29mZnNldCwgJmxlbikpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJ1ZmZlcltsb2NhdGlvbl9sZW5ndGhdID0gJ1wwJzsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleUxvY2F0aW9uLCBidWZmZXIpOworICAgICAgICAgICAgLy8gYWxsb3cgIiswKzAiIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2gKKyAgICAgICAgICAgIGlmIChsZW4gPCA0IHx8IGxlbiA+IGNodW5rX2RhdGFfc2l6ZSAtIDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhlIGxvY2F0aW9uIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhbmd1YWdlIGNvZGUgaXMgZm9ybWF0dGVkCisgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gSVNPIDY3MDk6MjAwOCAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzY3MDkpLgorICAgICAgICAgICAgLy8gQWxsb2NhdGUgMiBleHRyYSBieXRlcywgaW4gY2FzZSB3ZSBuZWVkIHRvIGFkZCBhIHRyYWlsaW5nIHNsYXNoLAorICAgICAgICAgICAgLy8gYW5kIHRvIGFkZCBhIHRlcm1pbmF0aW5nIDAuCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBidWZmZXIobmV3IChzdGQ6Om5vdGhyb3cpIGNoYXJbbGVuKzJdKCkpOworICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsgNCwgJmJ1ZmZlclswXSwgbGVuKSA8IGxlbikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuID0gc3RybGVuKCZidWZmZXJbMF0pOworICAgICAgICAgICAgaWYgKGxlbiA8IDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgdGhlcmUgd2Fzbid0IG9uZS4KKyAgICAgICAgICAgIGlmIChidWZmZXJbbGVuIC0gMV0gIT0gJy8nKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnLyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgJmJ1ZmZlclswXSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC01MTk0LDYgKzUyMDksNyBAQAogICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICdwJywgJzQnKSwKICAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcxJyksCiAgICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMicpLAorICAgICAgICBGT1VSQ0MoJ2QnLCAnYScsICdzJywgJ2gnKSwKIAogICAgICAgICAvLyBXb24ndCBwcm9taXNlIHRoYXQgdGhlIGZvbGxvd2luZyBmaWxlIHR5cGVzIGNhbiBiZSBwbGF5ZWQuCiAgICAgICAgIC8vIEp1c3QgZ2l2ZSB0aGVzZSBmaWxlIHR5cGVzIGEgY2hhbmNlLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCBiZDcxNjMyLi45OGQxMDFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtMjMsNyArMjMsOCBAQAogI2luY2x1ZGUgImluY2x1ZGUvU2hhcmVkTWVtb3J5QnVmZmVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggNTFmMWJhMy4uNjQwY2I4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51TWVkaWFFeHRyYWN0b3IiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lDYXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04Myw4ICs4Miw4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICBpZiAobUNhcyAhPSBOVUxMKSB7Ci0gICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzKTsKKyAgICBpZiAoIW1DYXNUb2tlbi5lbXB0eSgpKSB7CisgICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzVG9rZW4pOwogICAgIH0KIAogICAgIHN0YXR1c190IGVyciA9IHVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpOwpAQCAtMTE5LDggKzExOCw4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICBpZiAobUNhcyAhPSBOVUxMKSB7Ci0gICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzKTsKKyAgICBpZiAoIW1DYXNUb2tlbi5lbXB0eSgpKSB7CisgICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzVG9rZW4pOwogICAgIH0KIAogICAgIGVyciA9IHVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpOwpAQCAtMTQ5LDggKzE0OCw4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICBpZiAobUNhcyAhPSBOVUxMKSB7Ci0gICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzKTsKKyAgICBpZiAoIW1DYXNUb2tlbi5lbXB0eSgpKSB7CisgICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzVG9rZW4pOwogICAgIH0KIAogICAgIGVyciA9IHVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpOwpAQCAtMTYxLDI0ICsxNjAsMzYgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1zdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKSB7Ci0gICAgQUxPR1YoInNldE1lZGlhQ2FzOiBjYXM9JXAiLCBjYXMuZ2V0KCkpOworc3RhdGljIFN0cmluZzggYXJyYXlUb1N0cmluZyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYXJyYXkpIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5LnNpemUoKTsgaSsrKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUwMnggIiwgYXJyYXlbaV0pOworICAgIH0KKyAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIobnVsbCkiKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgeworICAgIEFMT0dWKCJzZXRNZWRpYUNhczogY2FzVG9rZW49eyVzfSIsIGFycmF5VG9TdHJpbmcoY2FzVG9rZW4pLmNfc3RyKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGlmIChjYXMgPT0gTlVMTCkgeworICAgIGlmIChjYXNUb2tlbi5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgbUNhc1Rva2VuID0gY2FzVG9rZW47CisKICAgICBpZiAobUltcGwgIT0gTlVMTCkgewotICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMoY2FzKTsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKGNhc1Rva2VuKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtQ2FzID0gY2FzOwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAppbmRleCA5ZmJkYjcyLi5lMGMwYzMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcApAQCAtMjE4LDYgKzIxOCwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0QUFDMjo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoICgoT01YX1UzMikgaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdBQUMgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQpAQCAtMzQyLDYgKzM2NiwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0FBQykKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BYWM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqYWFjUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAppbmRleCBhMWNmMjg1Li43M2EzOTY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIFNPRlRfQUFDXzJfSF8KICNkZWZpbmUgU09GVF9BQUNfMl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgogI2luY2x1ZGUgIkRyY1ByZXNNb2RlV3JhcC5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5oCmluZGV4IDk4MWNiYmIuLmU2NGMxYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0FBQ19FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IFZPX0FVRElPX0NPREVDQVBJOwogc3RydWN0IFZPX01FTV9PUEVSQVRPUjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oCmluZGV4IDEyM2ZkMjUuLjY4MWRjZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQUFDX0VOQ09ERVJfMl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJhYWNlbmNfbGliLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCmluZGV4IDc1NTMxNTMuLmI3ZTg0ZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcApAQCAtMTQzLDYgKzE0MywzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0QU1SOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nQU1SIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbXI6CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICphbXJQYXJhbXMgPQpAQCAtMjM2LDYgKzI2MCwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0FNUikKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbXI6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICphYWNQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuaAppbmRleCA3NThkNmFjLi44NjliODFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQU1SX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oCmluZGV4IDUwMTc4YzQuLmM3M2U0ZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9BTVJOQl9FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuaAppbmRleCBkMGMxZGFiLi44OTUwYThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0FNUldCX0VOQ09ERVJfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiAjaW5jbHVkZSAidm9BTVJXQi5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCmluZGV4IDE4Yjc1NTYuLjY3OWVkM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9IMjY0X0RFQ19IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAppbmRleCA4MThlNGExLi5hNDNjZGYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaAppbmRleCBjMDkwODFkLi40YTIxYzM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIFNPRlRfRkxBQ19ERUNPREVSX0gKIAogI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCmluZGV4IDYwMjdmNzYuLmY0ZjA2NTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0ZMQUNfRU5DX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgIkZMQUMvc3RyZWFtX2VuY29kZXIuaCIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggZjdjMDQyOS4uN2E0Y2NhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0xMDUsNiArMTA1LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRHNzExOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nRzcxMSA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0xNzMsNiArMTk3LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nRzcxMSkKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaAppbmRleCAxNmI2MzQwLi4zZWNlMjQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfRzcxMV9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAppbmRleCAxMTk5OWI0Li5kNzc3MjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcApAQCAtMTA1LDYgKzEwNSwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0R1NNOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nR1NNRlIgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTY0LDYgKzE4OCwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0dTTUZSKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKaW5kZXggMDMwM2RlYS4uZWY4NjkxNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfR1NNX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSAiZ3NtLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaAppbmRleCBlN2MyMTI3Li41ODAwNDkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0hFVkNfSF8KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oCmluZGV4IDQxMTRlN2QuLmUzOTlhYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfTVBFRzRfSF8KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogCiBzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCBhZThjYjZmLi4wMGYyZGQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDNkZWYxZjAuLjIzNjQ2ODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTM0LDYgKzEzNCwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0TVAzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nTVAzIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTIwOCw2ICsyMzIsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdNUDMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oCmluZGV4IDNiZmE2YzcuLjk3NmZkMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9NUDNfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBzdHJ1Y3QgdFBWTVAzRGVjb2RlckV4dGVybmFsOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwCmluZGV4IDlhNjkyMjYuLjlkNWYzNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwCkBAIC03ODksNyArNzg5LDcgQEAKIAogICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CiAgICAgICAgICAgICAgICAgc3NpemVfdCB0aW1lU3RhbXBJZHg7Ci0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIDMpIC8gMjsKIAogICAgICAgICAgICAgICAgIHRpbWVTdGFtcElkeCA9IGdldE1pblRpbWVzdGFtcElkeChtVGltZVN0YW1wcywgbVRpbWVTdGFtcHNWYWxpZCk7CiAgICAgICAgICAgICAgICAgaWYgKHRpbWVTdGFtcElkeCA8IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaAppbmRleCA2NzI5YTU0Li4zMzhmYzMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9NUEVHMl9IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCmluZGV4IDg0Y2Y3OWMuLmQ2YmI5MDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX1ZQWF9IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKICNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCA4NmRmYWQ3Li5kZDg2ZDM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX1ZQWF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKaW5kZXggYjhjMTgwNy4uZmFkOTg4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9BVkNfSF8KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAKICNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IDJhYzZjZTAuLmQxZjVlNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtMTI5LDYgKzEyOSwzMSBAQAogT01YX0VSUk9SVFlQRSBTb2Z0T3B1czo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyAoT01YX0FVRElPX0NPRElOR1RZUEUpT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTIDoKKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1czoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQpAQCAtMjEyLDYgKzIzNywzMCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQVVESU9fQ09ESU5HVFlQRSlPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICpvcHVzUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmgKaW5kZXggOTdmNjU2MS4uZmFiOTI1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmgKQEAgLTIzLDcgKzIzLDcgQEAKIAogI2RlZmluZSBTT0ZUX09QVVNfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBzdHJ1Y3QgT3B1c01TRGVjb2RlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKaW5kZXggYWNiMmIzNy4uMWE1MjdiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCkBAIC02MCw3ICs2MCw3IEBACiAgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CiAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDMyICogMTAyNDsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA2NCAqIDEwMjQ7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwpAQCAtNzgsNyArNzgsNyBAQAogICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gMzIgKiAxMDI0OworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDY0ICogMTAyNDsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CkBAIC0xMDAsNiArMTAwLDI4IEBACiBPTVhfRVJST1JUWVBFIFNvZnRSYXc6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0xNTMsNiArMTc1LDI2IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5oCmluZGV4IDgwOTA2YjQuLmViYzI3NDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9SQVdfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBzdHJ1Y3QgdFBWTVA0QXVkaW9EZWNvZGVyRXh0ZXJuYWw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggMTRkZDI1MC4uOTZlMDFiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTEyOSw2ICsxMjksMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdFZvcmJpczo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ1ZPUkJJUyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KQEAgLTIyMSw2ICsyNDUsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdWT1JCSVMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaAppbmRleCAzMGQxMzdiLi41MmQxNjMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9WT1JCSVNfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBzdHJ1Y3Qgdm9yYmlzX2RzcF9zdGF0ZTsKIHN0cnVjdCB2b3JiaXNfaW5mbzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAppbmRleCA5MTQ2MmM4Li45MTA4Y2UxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCkBAIC0xLDcgKzEsMTIgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSIsCkBAIC0xMSwxMiArMTYsMTMgQEAKICAgICAgICAgImluY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbiIsCiAgICAgXSwKIAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgIF0sCi0KICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oCmluZGV4IDBkYTJlODEuLmYyNTNhNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oCkBAIC0zMCw2ICszMCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgaGFyZHdhcmU6OmhpZGxfbWVtb3J5OworCiAvKioKICAqIEJ1ZmZlckNoYW5uZWxCYXNlIGltcGxlbWVudGF0aW9uIGZvciBBQ29kZWMuCiAgKi8KQEAgLTExNyw2ICsxMTksNyBAQAogICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKICAgICBzcDxJTWVtb3J5PiBtRGVjcnlwdERlc3RpbmF0aW9uOwogICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisgICAgaGlkbF9tZW1vcnkgbUhpZGxNZW1vcnk7CiAKICAgICAvLyBUaGVzZSBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCB2aWEgc3RkOjphdG9taWNfKiBmdW5jdGlvbnMuCiAgICAgLy8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKaW5kZXggMmE3NTI5OGYuLmFjOTNiNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCkBAIC00NSw3ICs0NSw3IEBACiAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJUU0V4dHJhY3RvciI7IH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IDJhYWE4ODQuLmQ2MTQ5YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDxNZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAppbmRleCAwZGQ3N2JhLi42MjQ1Y2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTI0LDI3ICsyNCwzMSBAQAogCiAjZGVmaW5lIFNUUklOR0lGWV9FTlVNUwogCi0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CiBjbGFzcyBCdWZmZXJDaGFubmVsQmFzZTsKIHN0cnVjdCBCdWZmZXJQcm9kdWNlcldyYXBwZXI7CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwogc3RydWN0IFBlcnNpc3RlbnRTdXJmYWNlOwogc3RydWN0IFJlbmRlcmVkRnJhbWVJbmZvOwogY2xhc3MgU3VyZmFjZTsKK3N0cnVjdCBJQ3J5cHRvOworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIG5hdGl2ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSURlc2NyYW1ibGVyOworfX19fQordXNpbmcgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpJRGVzY3JhbWJsZXI7CiAKIHN0cnVjdCBDb2RlY0Jhc2UgOiBwdWJsaWMgQUhhbmRsZXIsIC8qIHN0YXRpYyAqLyBDb2xvclV0aWxzIHsKICAgICAvKioKQEAgLTI1NiwxMyArMjYwLDkgQEAKICAgICAgICAgbUNhbGxiYWNrID0gc3RkOjptb3ZlKGNhbGxiYWNrKTsKICAgICB9CiAKLSAgICBpbmxpbmUgdm9pZCBzZXRDcnlwdG8oY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bykgewotICAgICAgICBtQ3J5cHRvID0gY3J5cHRvOwotICAgIH0KKyAgICB2b2lkIHNldENyeXB0byhjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvKTsKIAotICAgIGlubGluZSB2b2lkIHNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKSB7Ci0gICAgICAgIG1EZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyOwotICAgIH0KKyAgICB2b2lkIHNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKTsKIAogICAgIC8qKgogICAgICAqIFF1ZXVlIGFuIGlucHV0IGJ1ZmZlciBpbnRvIHRoZSBidWZmZXIgY2hhbm5lbC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggNDE0MDI2Ni4uMjA5ZmUxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTQ3LDEwICs0NywxMyBAQAogc3RydWN0IFBlcnNpc3RlbnRTdXJmYWNlOwogY2xhc3MgU29mdHdhcmVSZW5kZXJlcjsKIGNsYXNzIFN1cmZhY2U7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSURlc2NyYW1ibGVyOwotfTsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBuYXRpdmUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElEZXNjcmFtYmxlcjsKK319fX0KK3VzaW5nIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6SURlc2NyYW1ibGVyOwogCiBzdHJ1Y3QgTWVkaWFDb2RlYyA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBDb25maWd1cmVGbGFncyB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggMmU2NjNlYy4uNmE1YzZiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtNzksNiArNzksMjYgQEAKICAgICBIRUFSVEJFQVRfRVJST1JfQkFTRSA9IC0zMDAwLAogICAgIEVSUk9SX0hFQVJUQkVBVF9URVJNSU5BVEVfUkVRVUVTVEVEICAgICAgICAgICAgICAgICAgICAgPSBIRUFSVEJFQVRfRVJST1JfQkFTRSwKIAorICAgIC8vIENBUy1yZWxhdGVkIGVycm9yIGNvZGVzCisgICAgQ0FTX0VSUk9SX0JBU0UgPSAtNDAwMCwKKworICAgIEVSUk9SX0NBU19VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSwKKyAgICBFUlJPUl9DQVNfTk9fTElDRU5TRSAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxLAorICAgIEVSUk9SX0NBU19MSUNFTlNFX0VYUElSRUQgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDIsCisgICAgRVJST1JfQ0FTX1NFU1NJT05fTk9UX09QRU5FRCAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMywKKyAgICBFUlJPUl9DQVNfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCAgID0gQ0FTX0VSUk9SX0JBU0UgLSA0LAorICAgIEVSUk9SX0NBU19ERUNSWVBUICAgICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDUsCisgICAgRVJST1JfQ0FTX0NBTk5PVF9IQU5ETEUgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gNiwKKyAgICBFUlJPUl9DQVNfVEFNUEVSX0RFVEVDVEVEICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA3LAorICAgIEVSUk9SX0NBU19OT1RfUFJPVklTSU9ORUQgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDgsCisgICAgRVJST1JfQ0FTX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gOSwKKyAgICBFUlJPUl9DQVNfUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxMCwKKyAgICBFUlJPUl9DQVNfSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OID0gQ0FTX0VSUk9SX0JBU0UgLSAxMSwKKyAgICBFUlJPUl9DQVNfTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxMSwKKworICAgIEVSUk9SX0NBU19WRU5ET1JfTUFYICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDUwMCwKKyAgICBFUlJPUl9DQVNfVkVORE9SX01JTiAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA5OTksCisKICAgICAvLyBOREsgRXJyb3IgY29kZXMKICAgICAvLyBmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaAogICAgIC8vIGZyb20gLTEwMDAwICgweEZGRkZEOEYwIC0gMHhGRkZGRDhFQykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAppbmRleCBhODU2YjJiLi5mMTIxNjBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCkBAIC0yMywxMCArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLX07Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CiBjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IE1lZGlhU291cmNlOwogY2xhc3MgTWV0YURhdGE7CkBAIC03MCw3ICs2Niw3IEBACiAgICAgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgLyp1aWQqLykgewogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+JiAvKmNhcyovKSBvdmVycmlkZSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJi8qY2FzVG9rZW4qLykgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDNlM2NjMTcuLjZhOTNiZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCkBAIC0yOCwxMCArMjgsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLX0KLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CkBAIC02NCw3ICs2MCw3IEBACiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhc291cmNlKTsKIAotICAgIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpOworICAgIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pOwogCiAgICAgc2l6ZV90IGNvdW50VHJhY2tzKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0VHJhY2tGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCwgdWludDMyX3QgZmxhZ3MgPSAwKSBjb25zdDsKQEAgLTExNSw3ICsxMTEsNyBAQAogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogCiAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBtSW1wbDsKLSAgICBzcDxJQ2FzPiBtQ2FzOworICAgIEhJbnRlcmZhY2VUb2tlbiBtQ2FzVG9rZW47CiAKICAgICBWZWN0b3I8VHJhY2tJbmZvPiBtU2VsZWN0ZWRUcmFja3M7CiAgICAgaW50NjRfdCBtVG90YWxCaXRyYXRlOyAgLy8gaW4gYml0cy9zZWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCmluZGV4IGQzOGMzMzcuLmQxNjc3ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KIAotI2luY2x1ZGUgPE1ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogCiAjaW5jbHVkZSAiZm91bmRhdGlvbi9BQmFzZS5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggMzFlZGIyMS4uYTI1NmE0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgIkVTUXVldWUuaCIKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00MSw4ICs0MSwxMiBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotdXNpbmcgTWVkaWFEZXNjcmFtYmxlcjo6RGVzY3JhbWJsZUluZm87Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiAKIC8vIEkgd2FudCB0aGUgZXhwcmVzc2lvbiAieSIgZXZhbHVhdGVkIGV2ZW4gaWYgdmVyYm9zZSBsb2dnaW5nIGlzIG9mZi4KICNkZWZpbmUgTVlfTE9HVih4LCB5KSBcCkBAIC0yMDMsNiArMjA3LDcgQEAKICAgICBzcDxBTWVzc2FnZT4gbVNhbXBsZUFlc0tleUl0ZW07CiAgICAgc3A8SU1lbW9yeT4gbU1lbTsKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CisgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgbURlc2NyYW1ibGVyU3JjQnVmZmVyOwogICAgIHNwPEFCdWZmZXI+IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKICAgICBMaXN0PFN1YlNhbXBsZUluZm8+IG1TdWJTYW1wbGVzOwogICAgIHNwPElEZXNjcmFtYmxlcj4gbURlc2NyYW1ibGVyOwpAQCAtMjM1LDcgKzI0MCw3IEBACiAKICAgICAvLyBFbnN1cmUgaW50ZXJuYWwgYnVmZmVycyBjYW4gaG9sZCBzcGVjaWZpZWQgc2l6ZSwgYW5kIHdpbGwgcmUtYWxsb2NhdGUKICAgICAvLyBhcyBuZWVkZWQuCi0gICAgdm9pZCBlbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBlbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3Qgc2l6ZSk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW0pOwogfTsKQEAgLTgwNyw5ICs4MTIsOSBAQAogICAgIG1RdWV1ZSA9IE5VTEw7CiB9CiAKLXZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OmVuc3VyZUJ1ZmZlckNhcGFjaXR5KHNpemVfdCBuZWVkZWRTaXplKSB7Citib29sIEFUU1BhcnNlcjo6U3RyZWFtOjplbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3QgbmVlZGVkU2l6ZSkgewogICAgIGlmIChtQnVmZmVyICE9IE5VTEwgJiYgbUJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBuZWVkZWRTaXplKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgQUxPR1YoImVuc3VyZUJ1ZmZlckNhcGFjaXR5OiBjdXJyZW50IHNpemUgJXp1LCBuZXcgc2l6ZSAlenUsIHNjcmFtYmxlZCAlZCIsCkBAIC04MzcsNiArODQyLDI2IEBACiAgICAgICAgIG1NZW0gPSBuZXdNZW07CiAgICAgICAgIG1EZWFsZXIgPSBuZXdEZWFsZXI7CiAgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlciA9IG5ld1NjcmFtYmxlZEJ1ZmZlcjsKKworICAgICAgICBzc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbmV3TWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworICAgICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFuYXRpdmVIYW5kbGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBmYWlsZWQgdG8gY3JlYXRlIG5hdGl2ZSBoYW5kbGUiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlSGFuZGxlLT5kYXRhWzBdID0gaGVhcC0+Z2V0SGVhcElEKCk7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLAorICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKG5hdGl2ZUhhbmRsZSksIGhlYXAtPmdldFNpemUoKSk7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5vZmZzZXQgPSAodWludDY0X3QpIG9mZnNldDsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLnNpemUgPSAodWludDY0X3QpIHNpemU7CisKKyAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBvZmZzZXQgJXpkLCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG9mZnNldCwgc2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KICAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwpAQCAtODUwLDYgKzg3NSw3IEBACiAgICAgICAgIG5ld0J1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQogICAgIG1CdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXR1c190IEFUU1BhcnNlcjo6U3RyZWFtOjpwYXJzZSgKQEAgLTkyMyw3ICs5NDksOSBAQAogICAgIH0KIAogICAgIHNpemVfdCBuZWVkZWRTaXplID0gbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gODsKLSAgICBlbnN1cmVCdWZmZXJDYXBhY2l0eShuZWVkZWRTaXplKTsKKyAgICBpZiAoIWVuc3VyZUJ1ZmZlckNhcGFjaXR5KG5lZWRlZFNpemUpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQogCiAgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwgYnItPmRhdGEoKSwgcGF5bG9hZFNpemVCaXRzIC8gOCk7CiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gOCk7CkBAIC0xMzY1LDQ3ICsxMzkzLDU5IEBACiAgICAgICAgIG1lbWNweShtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIGRlc2NyYW1ibGVCeXRlcyk7CiAKLSAgICAgICAgc3A8QUJ1ZmZlcj4gc3ViU2FtcGxlcyA9IG5ldyBBQnVmZmVyKAotICAgICAgICAgICAgICAgIHNpemVvZihEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlKSAqIGRlc2NyYW1ibGVTdWJTYW1wbGVzKTsKLQotICAgICAgICBEZXNjcmFtYmxlSW5mbyBpbmZvOwotICAgICAgICBpbmZvLmRzdFR5cGUgPSBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcjsKLSAgICAgICAgaW5mby5zY3JhbWJsaW5nQ29udHJvbCA9IChEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wpc2N0cmw7Ci0gICAgICAgIGluZm8ubnVtU3ViU2FtcGxlcyA9IGRlc2NyYW1ibGVTdWJTYW1wbGVzOwotICAgICAgICBpbmZvLnN1YlNhbXBsZXMgPSAoRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqKXN1YlNhbXBsZXMtPmRhdGEoKTsKLSAgICAgICAgaW5mby5zcmNNZW0gPSBtTWVtOwotICAgICAgICBpbmZvLnNyY09mZnNldCA9IDA7Ci0gICAgICAgIGluZm8uZHN0UHRyID0gTlVMTDsgLy8gaW4tcGxhY2UgZGVzY3JhbWJsaW5nIGludG8gc3JjTWVtCi0gICAgICAgIGluZm8uZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOworICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CiAKICAgICAgICAgaW50MzJfdCBpID0gMDsKICAgICAgICAgZm9yIChhdXRvIGl0ID0gbVN1YlNhbXBsZXMuYmVnaW4oKTsKICAgICAgICAgICAgICAgICBpdCAhPSBtU3ViU2FtcGxlcy5lbmQoKSAmJiBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXM7IGl0KyssIGkrKykgewogICAgICAgICAgICAgaWYgKGl0LT50cmFuc3BvcnRfc2NyYW1ibGluZ19tb2RlICE9IDAgfHwgcGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgewotICAgICAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSA9IDA7Ci0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOworICAgICAgICAgICAgICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IDA7CisgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gMDsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7CiAgICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIGluZm8uc3JjT2Zmc2V0ID0gaW5mby5kc3RPZmZzZXQgPSBwZXNPZmZzZXQ7Ci0gICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbMF0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhIC09IHBlc09mZnNldDsKKyAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoaW5mbywgJnJlc3VsdCk7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgICAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOwogCi0gICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCBleGNlcHRpb25Db2RlPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHN0YXR1cy5leGNlcHRpb25Db2RlKCkpOworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWTsKKyAgICAgICAgZHN0QnVmZmVyLm5vbnNlY3VyZU1lbW9yeSA9IG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKKworICAgICAgICBhdXRvIHJldHVyblZvaWQgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoCisgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmJ5dGVzV3JpdHRlbiwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IF9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIGJ5dGVzV3JpdHRlbik7CiAgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggMzc0ZTAxMS4uNDFjMTljZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yOSwxMSArMjksMTMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotY2xhc3MgSURlc2NyYW1ibGVyOwotfTsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJQ2FzOworfX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpJQ2FzOworCiBjbGFzcyBBQml0UmVhZGVyOwogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAppbmRleCA5NmViNWJmLi4yMTI1OWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCkBAIC0zNSw1ICszNSw4IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmNwcAppbmRleCAwNDdiMWIzLi45ZmY0NTIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5jcHAKQEAgLTE4LDE1ICsxOCwxOSBAQAogI2RlZmluZSBMT0dfVEFHICJDYXNNYW5hZ2VyIgogI2luY2x1ZGUgIkNhc01hbmFnZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzLzEuMC9JQ2FzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lNZWRpYUNhc1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiAKIHN0cnVjdCBBVFNQYXJzZXI6OkNhc01hbmFnZXI6OlByb2dyYW1DYXNNYW5hZ2VyIDogcHVibGljIFJlZkJhc2UgewogICAgIFByb2dyYW1DYXNNYW5hZ2VyKHVuc2lnbmVkIHByb2dyYW1OdW1iZXIsIGNvbnN0IENBRGVzY3JpcHRvciAmZGVzY3JpcHRvcik7CkBAIC0xMjUsNDUgKzEyOSw2MCBAQAogICAgICAgICAgY29uc3Qgc3A8SUNhcz4mIGNhcywKICAgICAgICAgIFBpZFRvU2Vzc2lvbk1hcCAmc2Vzc2lvbk1hcCwKICAgICAgICAgIENhc1Nlc3Npb24gKnNlc3Npb24pIHsKLSAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgc3A8SUJpbmRlcj4gY2FzU2VydmljZUJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYXMiKSk7Ci0gICAgc3A8SU1lZGlhQ2FzU2VydmljZT4gY2FzU2VydmljZSA9Ci0gICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFDYXNTZXJ2aWNlPihjYXNTZXJ2aWNlQmluZGVyKTsKLQorICAgIHNwPElNZWRpYUNhc1NlcnZpY2U+IGNhc1NlcnZpY2UgPSBJTWVkaWFDYXNTZXJ2aWNlOjpnZXRTZXJ2aWNlKCJkZWZhdWx0Iik7CiAgICAgaWYgKGNhc1NlcnZpY2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiBJTWVkaWFDYXNTZXJ2aWNlIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAorICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcjsKKyAgICBzcDxJRGVzY3JhbWJsZXJCYXNlPiBkZXNjcmFtYmxlckJhc2U7CisgICAgUmV0dXJuPFN0YXR1cz4gcmV0dXJuU3RhdHVzKFN0YXR1czo6T0spOworICAgIFJldHVybjxzcDxJRGVzY3JhbWJsZXJCYXNlPiA+IHJldHVybkRlc2NyYW1ibGVyKE5VTEwpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKICAgICBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IgPSBzZXNzaW9uLT5tQ0FEZXNjcmlwdG9yOwogCi0gICAgU3RhdHVzIHN0YXR1cyA9IGNhcy0+b3BlblNlc3Npb24oJnNlc3Npb25JZCk7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBzZXNzaW9uOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIGF1dG8gcmV0dXJuVm9pZCA9IGNhcy0+b3BlblNlc3Npb24oCisgICAgICAgICAgICBbJnN0YXR1cywgJnNlc3Npb25JZF0gKFN0YXR1cyBfc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgX3Nlc3Npb25JZCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gX3Nlc3Npb25JZDsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHNlc3Npb246IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMpOwogICAgICAgICBnb3RvIGxfZmFpbDsKICAgICB9CiAKLSAgICBjYXMtPnNldFNlc3Npb25Qcml2YXRlRGF0YShzZXNzaW9uSWQsIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcHJpdmF0ZSBkYXRhOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIHJldHVyblN0YXR1cyA9IGNhcy0+c2V0U2Vzc2lvblByaXZhdGVEYXRhKHNlc3Npb25JZCwgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEpOworICAgIGlmICghcmV0dXJuU3RhdHVzLmlzT2soKSB8fCByZXR1cm5TdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcml2YXRlIGRhdGE6IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCksIChTdGF0dXMpcmV0dXJuU3RhdHVzKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgc3RhdHVzID0gY2FzU2VydmljZS0+Y3JlYXRlRGVzY3JhbWJsZXIoZGVzY3JpcHRvci5tU3lzdGVtSUQsICZkZXNjcmFtYmxlcik7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpIHx8IGRlc2NyYW1ibGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGVzY3JhbWJsZXI6IDogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5EZXNjcmFtYmxlciA9IGNhc1NlcnZpY2UtPmNyZWF0ZURlc2NyYW1ibGVyKGRlc2NyaXB0b3IubVN5c3RlbUlEKTsKKyAgICBpZiAoIXJldHVybkRlc2NyYW1ibGVyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkZXNjcmFtYmxlcjogdHJhbnM9JXMiLAorICAgICAgICAgICAgICAgIHJldHVybkRlc2NyYW1ibGVyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIGdvdG8gbF9mYWlsOworICAgIH0KKyAgICBkZXNjcmFtYmxlckJhc2UgPSAoc3A8SURlc2NyYW1ibGVyQmFzZT4pIHJldHVybkRlc2NyYW1ibGVyOworICAgIGlmIChkZXNjcmFtYmxlckJhc2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkZXNjcmFtYmxlcjogbnVsbCBwdHIiKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgc3RhdHVzID0gZGVzY3JhbWJsZXItPnNldE1lZGlhQ2FzU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZGVzY3JhbWJsZXI6IDogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5TdGF0dXMgPSBkZXNjcmFtYmxlckJhc2UtPnNldE1lZGlhQ2FzU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIGlmICghcmV0dXJuU3RhdHVzLmlzT2soKSB8fCAoU3RhdHVzKSByZXR1cm5TdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZGVzY3JhbWJsZXI6IDogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgKFN0YXR1cykgcmV0dXJuU3RhdHVzKTsKKyAgICAgICAgZ290byBsX2ZhaWw7CisgICAgfQorCisgICAgZGVzY3JhbWJsZXIgPSBJRGVzY3JhbWJsZXI6OmNhc3RGcm9tKGRlc2NyYW1ibGVyQmFzZSk7CisgICAgaWYgKGRlc2NyYW1ibGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjYXN0IGZyb20gSURlc2NyYW1ibGVyQmFzZSB0byBJRGVzY3JhbWJsZXIiKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCkBAIC0xNzcsOCArMTk2LDggQEAKICAgICBpZiAoIXNlc3Npb25JZC5lbXB0eSgpKSB7CiAgICAgICAgIGNhcy0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgfQotICAgIGlmIChkZXNjcmFtYmxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlc2NyYW1ibGVyLT5yZWxlYXNlKCk7CisgICAgaWYgKGRlc2NyYW1ibGVyQmFzZSAhPSBOVUxMKSB7CisgICAgICAgIGRlc2NyYW1ibGVyQmFzZS0+cmVsZWFzZSgpOwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KQEAgLTMxNiwxMSArMzM1LDEyIEBACiAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIE1lZGlhQ2FzOjpQYXJjZWxhYmxlQ2FzRGF0YSBlY20oYnItPmRhdGEoKSwgYnItPm51bUJpdHNMZWZ0KCkgLyA4KTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbUlDYXMtPnByb2Nlc3NFY20obUNBUGlkVG9TZXNzaW9uSWRNYXBbaW5kZXhdLCBlY20pOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHByb2Nlc3MgRUNNOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGVjbTsKKyAgICBlY20uc2V0VG9FeHRlcm5hbCgodWludDhfdCopYnItPmRhdGEoKSwgYnItPm51bUJpdHNMZWZ0KCkgLyA4KTsKKyAgICBhdXRvIHJldHVyblN0YXR1cyA9IG1JQ2FzLT5wcm9jZXNzRWNtKG1DQVBpZFRvU2Vzc2lvbklkTWFwW2luZGV4XSwgZWNtKTsKKyAgICBpZiAoIXJldHVyblN0YXR1cy5pc09rKCkgfHwgKFN0YXR1cykgcmV0dXJuU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwcm9jZXNzIEVDTTogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgKFN0YXR1cykgcmV0dXJuU3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7IC8vIGhhbmRsZWQKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKaW5kZXggODA4OGRlYy4uODFmNjU0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKQEAgLTIxLDEwICsyMSwxMyBAQAogI2luY2x1ZGUgPHNldD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci1jbGFzcyBJRGVzY3JhbWJsZXI7Ci19CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhcyB7CituYW1lc3BhY2UgbmF0aXZlIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJRGVzY3JhbWJsZXI7Cit9fX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OklEZXNjcmFtYmxlcjsKIAogc3RydWN0IEFUU1BhcnNlcjo6Q2FzTWFuYWdlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBDYXNNYW5hZ2VyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCBjM2YxMjc0Li45ZDY4NGUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTM4LDggKzM4LDEzIEBACiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCisjaW5jbHVkZSA8aGlkbC9IeWJyaWRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy8xLjAvSUNhcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGhhcmR3YXJlOjpjYXM6OlYxXzA6OklDYXM7CisKIHN0YXRpYyBjb25zdCBzaXplX3Qga1RTUGFja2V0U2l6ZSA9IDE4ODsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmVhZFNpemUgPSAyNTAwMDBMTDsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmV0cnkgPSA2OwpAQCAtMTU2LDcgKzE2MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQsIG1pbWUpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcykgeworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgeworICAgIEhhbFRva2VuIGhhbFRva2VuOworICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWNhc1Rva2VuLmRhdGEoKSwgY2FzVG9rZW4uc2l6ZSgpKTsKKyAgICBzcDxJQ2FzPiBjYXMgPSBJQ2FzOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOwogICAgIEFMT0dEKCJzZXRNZWRpYUNhczogJXAiLCBjYXMuZ2V0KCkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+c2V0TWVkaWFDYXMoY2FzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAppbmRleCA3ODkzNzlhLi5kZmFiM2IwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCkBAIC0xOSwyMCArMTksMTkgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oPgogCi0jaW5jbHVkZSAiLi4vT01YVXRpbHMuaCIKLSNpbmNsdWRlICIuLi9PTVhNYXN0ZXIuaCIKLSNpbmNsdWRlICIuLi9HcmFwaGljQnVmZmVyU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmg+CiAKLSNpbmNsdWRlICJXT214Tm9kZS5oIgotI2luY2x1ZGUgIldPbXhPYnNlcnZlci5oIgotI2luY2x1ZGUgIldHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCIKLSNpbmNsdWRlICJXR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKLQotI2luY2x1ZGUgIk9teC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAppbmRleCAwZTM3YWY5Li5hODI2MjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcApAQCAtMTksOCArMTksOCBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KIAotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJPbXhTdG9yZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwCmluZGV4IGFjZGEwNjAuLmQyYjI0NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcApAQCAtMTgsOSArMTgsOSBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KIAotI2luY2x1ZGUgIldHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCIKLSNpbmNsdWRlICJXUHJvZHVjZXJMaXN0ZW5lci5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IGQ4NTQwZjguLjM2OTc0MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0xNywxNSArMTcsMTQgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVFdHcmFwaGljQnVmZmVyU291cmNlIgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teEJ1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgotI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KLSNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KLQotI2luY2x1ZGUgIm9teC9PTVhVdGlscy5oIgotI2luY2x1ZGUgIldHcmFwaGljQnVmZmVyU291cmNlLmgiCi0jaW5jbHVkZSAiV09teE5vZGUuaCIKLSNpbmNsdWRlICJDb252ZXJzaW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDgwMzI4M2EuLmM4Yzk2M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmNwcApAQCAtMTYsOCArMTYsOCBAQAogCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCi0jaW5jbHVkZSAiV09teEJ1ZmZlclNvdXJjZS5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5jcHAKaW5kZXggOTFkMTAxMC4uOWY4MjI4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5jcHAKQEAgLTE2LDkgKzE2LDkgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAotI2luY2x1ZGUgIldPbXhOb2RlLmgiCi0jaW5jbHVkZSAiV09teEJ1ZmZlclNvdXJjZS5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5jcHAKaW5kZXggMzU0ZGIyOS4uY2NiZTI1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmNwcApAQCAtMTYsMTQgKzE2LDE0IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiV09teE9ic2VydmVyLWltcGwiCiAKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgogCi0jaW5jbHVkZSAiV09teE9ic2VydmVyLmgiCi0jaW5jbHVkZSAiQ29udmVyc2lvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwCmluZGV4IGJlMGQ0ZDUuLmJkYzNhYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiV1Byb2R1Y2VyTGlzdGVuZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCmluZGV4IDJkOTIxZjkuLjMwMjdjZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCkBAIC0yNSw4ICsyNSwxMSBAQAogICAgICAgICAiMS4wL1dPbXhCdWZmZXJTb3VyY2UuY3BwIiwKICAgICBdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKwogICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwgLy8gZm9yIG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKQEAgLTM1LDYgKzM4LDE0IEBACiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCkBAIC00NSwxMiArNTYsMTIgQEAKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsIC8vIFRPRE8oYi82MjkyMzQ3OSk6IHVzZSBoZWFkZXIgbGlicmFyeQotICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWFAMS4wIiwKQEAgLTU5LDcgKzcwLDEyIEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCiAgICAgXSwKIAotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLApAQCAtODMsMTIgKzk5LDIxIEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCiAgICAgc3JjczogWyJPTVhVdGlscy5jcHAiXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICBdLAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCA3OWY2ZDkzLi45NGVmNTk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMTcsMTUgKzE3LDEzIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkJXR3JhcGhpY0J1ZmZlclNvdXJjZSIKIAotI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KLSNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KIAotI2luY2x1ZGUgIk9NWFV0aWxzLmgiCi0jaW5jbHVkZSAiQldHcmFwaGljQnVmZmVyU291cmNlLmgiCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IE9NWF9VMzIga1BvcnRJbmRleElucHV0ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5jcHAKaW5kZXggOWE0OTUyZS4uMGM1MGM1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5jcHAKQEAgLTE4LDggKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiRnJhbWVEcm9wcGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiRnJhbWVEcm9wcGVyLmgiCi0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IGVmNGQ3NDUuLmNhZjNhYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTIyLDcgKzIyLDkgQEAKIAogI2RlZmluZSBTVFJJTkdJRllfRU5VTVMgLy8gZm9yIGFzU3RyaW5nIGluIEhhcmR3YXJlQVBJLmgvVmlkZW9BUEkuaAogCi0jaW5jbHVkZSAiR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgpAQCAtMzEsMTQgKzMzLDEyIEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtLmg+Ci0jaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KLSNpbmNsdWRlICJvbXgvT01YVXRpbHMuaCIKLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+Ci0jaW5jbHVkZSAibWVkaWEvT01YQnVmZmVyLmgiCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJGcmFtZURyb3BwZXIuaCIKIAogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8bWVtb3J5PgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCA4YzExNDFkLi45M2I0ZGJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtMjIsMTUgKzIyLDEyIEBACiAKICNpbmNsdWRlIDxkbGZjbi5oPgogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9PTVguaCIKLQotI2luY2x1ZGUgIi4uL2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgiCi0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlICJCV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCIKLQotI2luY2x1ZGUgIk9NWE1hc3Rlci5oIgotI2luY2x1ZGUgIk9NWFV0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAppbmRleCBhYzliMGMzLi5mZDk3ZmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApAQCAtMTgsMTUgKzE4LDEzIEBACiAjZGVmaW5lIExPR19UQUcgIk9NWE1hc3RlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIk9NWE1hc3Rlci5oIgotCi0jaW5jbHVkZSAiU29mdE9NWFBsdWdpbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE9NWE1hc3Rlcjo6T01YTWFzdGVyKCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggMjJkN2QyNy4uYzc0OTQ1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTIwLDIwICsyMCwyMCBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgiCi0jaW5jbHVkZSAiT01YTWFzdGVyLmgiCi0jaW5jbHVkZSAiT01YVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgogCi0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgotI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KICNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KIAogI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgogCkBAIC0yNDYsNiArMjQ2LDE1IEBACiAgICAgdmlydHVhbCB+Q2FsbGJhY2tEaXNwYXRjaGVyKCk7CiAKIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgZnJhbWVfcmVuZGVyZWQgbWVzc2FnZSBiYXRjaGluZywgd2hpY2ggd2lsbCBldmVudHVhbGx5IGVuZCB1cCBpbiBhCisgICAgICAgIC8vIHNpbmdsZSBBTWVzc2FnZSBpbiBNZWRpYUNvZGVjIHdoZW4gaXQgaXMgc2lnbmFsZWQgdG8gdGhlIGFwcC4gQU1lc3NhZ2UgY2FuIGNvbnRhaW4KKyAgICAgICAgLy8gdXAtdG8gNjQga2V5LXZhbHVlIHBhaXJzLCBhbmQgZWFjaCBmcmFtZV9yZW5kZXJlZCBtZXNzYWdlIHVzZXMgMiBrZXlzLCBzbyB0aGUgbWF4CisgICAgICAgIC8vIHZhbHVlIGZvciB0aGlzIHdvdWxkIGJlIDMyLiBOb25ldGhlbGVzcywgbGltaXQgdGhpcyB0byAxMiB0byB3aGljaCBnaXZlcyBhdCBsZWFzdCAxMAorICAgICAgICAvLyBtc2Vjb25kcyBvZiBiYXRjaGluZyBhdCAxMjBIei4KKyAgICAgICAga01heFF1ZXVlU2l6ZSA9IDEyLAorICAgIH07CisKICAgICBNdXRleCBtTG9jazsKIAogICAgIHNwPE9NWE5vZGVJbnN0YW5jZT4gY29uc3QgbU93bmVyOwpAQCAtMjkwLDcgKzI5OSw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIG1RdWV1ZS5wdXNoX2JhY2sobXNnKTsKLSAgICBpZiAocmVhbFRpbWUpIHsKKyAgICBpZiAocmVhbFRpbWUgfHwgbVF1ZXVlLnNpemUoKSA+PSBrTWF4UXVldWVTaXplKSB7CiAgICAgICAgIG1RdWV1ZUNoYW5nZWQuc2lnbmFsKCk7CiAgICAgfQogfQpAQCAtMjE2OCw4ICsyMTc3LDggQEAKICAgICAgICAgICAgIG1zZy5mZW5jZUZkID0gLTE7CiAgICAgICAgICAgICBtc2cudS5yZW5kZXJfZGF0YS50aW1lc3RhbXAgPSByZW5kZXJEYXRhW2ldLm5NZWRpYVRpbWVVczsKICAgICAgICAgICAgIG1zZy51LnJlbmRlcl9kYXRhLm5hbm9UaW1lID0gcmVuZGVyRGF0YVtpXS5uU3lzdGVtVGltZU5zOwotCi0gICAgICAgICAgICBpbnN0YW5jZS0+bURpc3BhdGNoZXItPnBvc3QobXNnLCBmYWxzZSAvKiByZWFsVGltZSAqLyk7CisgICAgICAgICAgICBib29sIHJlYWxUaW1lID0gbXNnLnUucmVuZGVyX2RhdGEudGltZXN0YW1wID09IElOVDY0X01BWDsKKyAgICAgICAgICAgIGluc3RhbmNlLT5tRGlzcGF0Y2hlci0+cG9zdChtc2csIHJlYWxUaW1lKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAppbmRleCBhNjZkNTY1Li41ODk0ODM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKQEAgLTE5LDEzICsxOSwxMyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLWJhc2UuaD4KLSNpbmNsdWRlICJPTVhVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCA3NjFiNDI1Li4wOWU2ZDc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCkBAIC0xOCw4ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggZGY5NzhmOC4uZWUyNjllMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMTgsOCArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJTb2Z0T01YQ29tcG9uZW50IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgiCi0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAppbmRleCBmY2NiMTJiLi40OTQ2YWRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCkBAIC0xOCw4ICsxOCw4IEBACiAjZGVmaW5lIExPR19UQUcgIlNvZnRPTVhQbHVnaW4iCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJTb2Z0T01YUGx1Z2luLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KQEAgLTg1LDcgKzg1LDIxIEBACiAgICAgICAgIGxpYk5hbWUuYXBwZW5kKGtDb21wb25lbnRzW2ldLm1MaWJOYW1lU3VmZml4KTsKICAgICAgICAgbGliTmFtZS5hcHBlbmQoIi5zbyIpOwogCi0gICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJOYW1lLmNfc3RyKCksIFJUTERfTk9XKTsKKyAgICAgICAgLy8gUlRMRF9OT0RFTEVURSBtZWFucyB3ZSBrZWVwIHRoZSBzaGFyZWQgbGlicmFyeSBhcm91bmQgZm9yZXZlci4KKyAgICAgICAgLy8gdGhpcyBlbGltaW5hdGVzIHRocmFzaGluZyBkdXJpbmcgc2VxdWVuY2VzIGxpa2UgbG9hZGluZyBzb3VuZHBvb2xzLgorICAgICAgICAvLyBJdCBhbHNvIGxlYXZlcyB0aGUgcmVzdCBvZiB0aGUgbG9naWMgYXJvdW5kIHRoZSBkbG9wZW4oKS9kbGNsb3NlKCkKKyAgICAgICAgLy8gY2FsbHMgaW4gdGhpcyBmaWxlIHVuY2hhbmdlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW1wbGljYXRpb25zIG9mIHRoZSBjaGFuZ2U6CisgICAgICAgIC8vIC0tIHRoZSBjb2RlYyBwcm9jZXNzICh3aGVyZSB0aGlzIGhhcHBlbnMpIHdpbGwgaGF2ZSBhIHNsaWdodGx5IGxhcmdlcgorICAgICAgICAvLyAgICBsb25nLXRlcm0gbWVtb3J5IGZvb3RwcmludCBhcyBpdCBhY2N1bXVsYXRlcyB0aGUgbG9hZGVkIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICAgIC8vICAgIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5LgorICAgICAgICAvLyAtLSBwbHVnaW4gY29kZWNzIGNhbiBubyBsb25nZXIgKGFuZCBuZXZlciBzaG91bGQgaGF2ZSkgZGVwZW5kIG9uIGEKKyAgICAgICAgLy8gICAgZnJlZSByZXNldCBvZiBhbnkgc3RhdGljIGRhdGEgYXMgdGhlIGxpYnJhcnkgd291bGQgaGF2ZSBjcm9zc2VkCisgICAgICAgIC8vICAgIGEgZGxjbG9zZS9kbG9wZW4gY3ljbGUuCisgICAgICAgIC8vCisKKyAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYk5hbWUuY19zdHIoKSwgUlRMRF9OT1d8UlRMRF9OT0RFTEVURSk7CiAKICAgICAgICAgaWYgKGxpYkhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGRsb3BlbiAlczogJXMiLCBsaWJOYW1lLmNfc3RyKCksIGRsZXJyb3IoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggOTIwZGQxOC4uMjRlZDk4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMjAsMTQgKzIwLDE0IEBACiAjZGVmaW5lIExPR19UQUcgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDdlY2ZiYmIuLmYzM2JkYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTIxLDI1ICsyMSwyMiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgotCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgogCiAjaW5jbHVkZSA8dWkvRmVuY2UuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CiAjaW5jbHVkZSA8dWkvUmVjdC5oPgogCiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgotCiAjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CiAKLSNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjb25zdCBzdGF0aWMgT01YX0NPTE9SX0ZPUk1BVFRZUEUga1N1cHBvcnRlZENvbG9yRm9ybWF0c1tdID0gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKaW5kZXggZmQ5MTU3NC4uZjMxOWJkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKQEAgLTI5LDEyICsyOSwxMiBAQAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CiAjaW5jbHVkZSA8dWkvRmVuY2VUaW1lLmg+Ci0jaW5jbHVkZSA8bWVkaWEvT01YRmVuY2VQYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCisjaW5jbHVkZSA8bWVkaWEvT01YRmVuY2VQYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+Ci0jaW5jbHVkZSA8VmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCmluZGV4IDIzNzg0YWEuLmE2YTlkM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaApAQCAtMjAsMTAgKzIwLDkgQEAKICNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKaW5kZXggNDU0OWM5Ny4uYjlmMjJhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9CbkdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KIAotI2luY2x1ZGUgIi4uL0dyYXBoaWNCdWZmZXJTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmgKaW5kZXggZDcxNTM3NC4uMzhkNTg4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaApAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214T2JzZXJ2ZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0lPbXhOb2RlV3JhcHBlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0lPbXhOb2RlV3JhcHBlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvSU9teE5vZGVXcmFwcGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9JT214Tm9kZVdyYXBwZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmgKaW5kZXggNGFmM2QzOS4uNTk0YjRjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAjaW5jbHVkZSAiT214Tm9kZU93bmVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9GcmFtZURyb3BwZXJfdGVzdC5jcHAKaW5kZXggZjk2NmI1ZS4uYTkyNWRhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCi0jaW5jbHVkZSAiRnJhbWVEcm9wcGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL0FuZHJvaWQuYnAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCmluZGV4IDJmMTBjYjEuLjhlMjJmOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJAMS4wIiwKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwpAQCAtMTEsNiArMTEsMTAgQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCiAgICAgXSwKIAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliZXhwYXQiLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAppbmRleCA4NGU1NTE0Li40ZmRkMTA3IDEwMDY0NAotLS0gYS9tZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY3NYbWxQYXJzZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL01lZGlhQ29kZWNzWG1sUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmgKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAppbmRleCA2MzdiZjliLi43ZTdlODFlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaWZuZGVmIF9OREtfTUVESUFfQ09ERUNfSAogI2RlZmluZSBfTkRLX01FRElBX0NPREVDX0gKIAorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCiAjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKQEAgLTEzMCwxNyArMTMxLDQ1IEBACiAgKi8KIHNzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgaW50NjRfdCB0aW1lb3V0VXMpOwogCi0vKioKLSAqIFNlbmQgdGhlIHNwZWNpZmllZCBidWZmZXIgdG8gdGhlIGNvZGVjIGZvciBwcm9jZXNzaW5nLgorLyoKKyAqIF9fVVNFX0ZJTEVfT0ZGU0VUNjQgY2hhbmdlcyB0aGUgdHlwZSBvZiBvZmZfdCBpbiBMUDMyLCB3aGljaCBjaGFuZ2VzIHRoZSBBQkkKKyAqIG9mIHRoZXNlIGRlY2xhcmF0aW9ucyB0byAgbm90IG1hdGNoIHRoZSBwbGF0Zm9ybS4gSW4gdGhhdCBjYXNlLCBkZWZpbmUgdGhlc2UKKyAqIEFQSXMgaW4gdGVybXMgb2YgaW50MzJfdCBpbnN0ZWFkLiBQYXNzaW5nIGFuIG9mZl90IGluIHRoaXMgc2l0dWF0aW9uIHdpbGwKKyAqIHJlc3VsdCBpbiBzaWxlbnQgdHJ1bmNhdGlvbiB1bmxlc3MgdGhlIHVzZXIgYnVpbGRzIHdpdGggLVdjb252ZXJzaW9uLCBidXQgdGhlCisgKiBvbmx5IGFsdGVybmF0aXZlIGl0IHRvIG5vdCBleHBvc2UgdGhlbSBhdCBhbGwgZm9yIHRoaXMgY29uZmlndXJhdGlvbiwgd2hpY2gKKyAqIG1ha2VzIHRoZSB3aG9sZSBBUEkgdW51c2FibGUuCisgKgorICogaHR0cHM6Ly9naXRodWIuY29tL2FuZHJvaWQtbmRrL25kay9pc3N1ZXMvNDU5CiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLAotICAgICAgICBzaXplX3QgaWR4LCBvZmZfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncyk7CisjaWYgZGVmaW5lZChfX1VTRV9GSUxFX09GRlNFVDY0KSAmJiAhZGVmaW5lZChfX0xQNjRfXykKKyNkZWZpbmUgX29mZl90X2NvbXBhdCBpbnQzMl90CisjZWxzZQorI2RlZmluZSBfb2ZmX3RfY29tcGF0IG9mZl90CisjZW5kaWYgIC8qIGRlZmluZWQoX19VU0VfRklMRV9PRkZTRVQ2NCkgJiYgIWRlZmluZWQoX19MUDY0X18pICovCisKKyNpZiAoZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgfHwgXAorICAgIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTAorc3RhdGljX2Fzc2VydChzaXplb2YoX29mZl90X2NvbXBhdCkgPT0gc2l6ZW9mKGxvbmcpLAorICAgICAgICAgICAgICAiX29mZl90X2NvbXBhdCBkb2VzIG5vdCBtYXRjaCB0aGUgTkRLIEFCSS4gU2VlICIKKyAgICAgICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyb2lkLW5kay9uZGsvaXNzdWVzLzQ1OS4iKTsKKyNlbmRpZgogCiAvKioKICAqIFNlbmQgdGhlIHNwZWNpZmllZCBidWZmZXIgdG8gdGhlIGNvZGVjIGZvciBwcm9jZXNzaW5nLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwKLSAgICAgICAgc2l6ZV90IGlkeCwgb2ZmX3Qgb2Zmc2V0LCBBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncyk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29mZl90X2NvbXBhdCBvZmZzZXQsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncyk7CisKKy8qKgorICogU2VuZCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciB0byB0aGUgY29kZWMgZm9yIHByb2Nlc3NpbmcuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb2ZmX3RfY29tcGF0IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpOworCisjdW5kZWYgX29mZl90X2NvbXBhdAogCiAvKioKICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJ1ZmZlciBvZiBwcm9jZXNzZWQgZGF0YS4KZGlmZiAtLWdpdCBhL21lZGlhL3ZuZGsvQW5kcm9pZC5icCBiL21lZGlhL3ZuZGsvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzZmQxNi4uMDAwMDAwMAotLS0gYS9tZWRpYS92bmRrL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXN1YmRpcnMgPSBbCi0gICAgInhtbHBhcnNlci8xLjAiLAotXQotCmRpZmYgLS1naXQgYS9yYWRpby9BbmRyb2lkLmJwIGIvcmFkaW8vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2MTRmMi4uMDAwMDAwMAotLS0gYS9yYWRpby9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJyYWRpbyIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJSYWRpby5jcHAiLAotICAgICAgICAiSVJhZGlvLmNwcCIsCi0gICAgICAgICJJUmFkaW9DbGllbnQuY3BwIiwKLSAgICAgICAgIklSYWRpb1NlcnZpY2UuY3BwIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnJhZGlvX21ldGFkYXRhIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvLmNwcCBiL3JhZGlvL0lSYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjNiNjguLjAwMDAwMDAKLS0tIGEvcmFkaW8vSVJhZGlvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIklSYWRpbyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vUmFkaW9NZXRhZGF0YVdyYXBwZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBERVRBQ0ggPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNFVF9DT05GSUdVUkFUSU9OLAotICAgIEdFVF9DT05GSUdVUkFUSU9OLAotICAgIFNFVF9NVVRFLAotICAgIEdFVF9NVVRFLAotICAgIFNDQU4sCi0gICAgU1RFUCwKLSAgICBUVU5FLAotICAgIENBTkNFTCwKLSAgICBHRVRfUFJPR1JBTV9JTkZPUk1BVElPTiwKLSAgICBIQVNfQ09OVFJPTAotfTsKLQotY2xhc3MgQnBSYWRpbzogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpbz4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElSYWRpbz4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBkZXRhY2goKQotICAgIHsKLSAgICAgICAgQUxPR1YoImRldGFjaCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERVRBQ0gsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DT05GSUdVUkFUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPTkZJR1VSQVRJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG11dGUgPyAxIDogMCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTVVURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGlmIChtdXRlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NVVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBtdXRlcmVhZCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgICptdXRlID0gbXV0ZXJlYWQgIT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXJlY3Rpb24pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2tpcFN1YkNoYW5uZWwgPyAxIDogMCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTQ0FOLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlyZWN0aW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNraXBTdWJDaGFubmVsID8gMSA6IDApOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RFUCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB0dW5lKHVpbnQzMl90IGNoYW5uZWwsIHVpbnQzMl90IHN1YkNoYW5uZWwpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoY2hhbm5lbCk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3ViQ2hhbm5lbCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChUVU5FLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbCgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDQU5DRUwsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGlmIChpbmZvID09IG51bGxwdHIgfHwgaW5mby0+bWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByYWRpb19tZXRhZGF0YV90ICptZXRhZGF0YSA9IGluZm8tPm1ldGFkYXRhOwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BST0dSQU1fSU5GT1JNQVRJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkKGluZm8sIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBsb2NhbCBtZXRhZGF0YSBwb2ludGVyCi0gICAgICAgICAgICAgICAgaW5mby0+bWV0YWRhdGEgPSBtZXRhZGF0YTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9IHJlcGx5LnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfdCAqbmV3TWV0YWRhdGEgPSAocmFkaW9fbWV0YWRhdGFfdCAqKW1hbGxvYyhtZXRhZGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3TWV0YWRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXBseS5yZWFkKG5ld01ldGFkYXRhLCBtZXRhZGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSByYWRpb19tZXRhZGF0YV9hZGRfbWV0YWRhdGEoJmluZm8tPm1ldGFkYXRhLCBuZXdNZXRhZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUobmV3TWV0YWRhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoaGFzQ29udHJvbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChIQVNfQ09OVFJPTCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICpoYXNDb250cm9sID0gcmVwbHkucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpbywgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5SYWRpbzo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgREVUQUNIOiB7Ci0gICAgICAgICAgICBBTE9HVigiREVUQUNIIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBkZXRhY2goKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfQ09ORklHVVJBVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRDb25maWd1cmF0aW9uKCZjb25maWcpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9DT05GSUdVUkFUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgY29uZmlnOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0Q29uZmlndXJhdGlvbigmY29uZmlnKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNFVF9NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIG11dGUgPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRNdXRlKG11dGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIG11dGU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNdXRlKCZtdXRlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobXV0ZSA/IDEgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNDQU46IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IChyYWRpb19kaXJlY3Rpb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYm9vbCBza2lwU3ViQ2hhbm5lbCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNjYW4oZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU1RFUDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gKHJhZGlvX2RpcmVjdGlvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIHNraXBTdWJDaGFubmVsID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RlcChkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUVU5FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdWJDaGFubmVsID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB0dW5lKGNoYW5uZWwsIHN1YkNoYW5uZWwpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENBTkNFTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2FuY2VsKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgR0VUX1BST0dSQU1fSU5GT1JNQVRJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gaW5mbzsKLSAgICAgICAgICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmaW5mby5tZXRhZGF0YSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFByb2dyYW1JbmZvcm1hdGlvbigmaW5mbyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaW5mbywgc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8pKTsKLSAgICAgICAgICAgICAgICBpZiAocmFkaW9fbWV0YWRhdGFfZ2V0X2NvdW50KGluZm8ubWV0YWRhdGEpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHJhZGlvX21ldGFkYXRhX2dldF9zaXplKGluZm8ubWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoKHVpbnQzMl90KXNpemUpOwotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaW5mby5tZXRhZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEhBU19DT05UUk9MOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGNvbnRyb2w7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYXNDb250cm9sKCZjb250cm9sKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY29udHJvbCA/IDEgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpb0NsaWVudC5jcHAgYi9yYWRpby9JUmFkaW9DbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTIxOTQ5Li4wMDAwMDAwCi0tLSBhL3JhZGlvL0lSYWRpb0NsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIE9OX0VWRU5UID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLX07Ci0KLWNsYXNzIEJwUmFkaW9DbGllbnQ6IHB1YmxpYyBCcEludGVyZmFjZTxJUmFkaW9DbGllbnQ+Ci17Ci0KLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElSYWRpb0NsaWVudD4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGV2ZW50TWVtb3J5KSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpb0NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5JUmFkaW9DbGllbnQiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblJhZGlvQ2xpZW50OjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBPTl9FVkVOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpb0NsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBvbkV2ZW50KGV2ZW50TWVtb3J5KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfSAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAgYi9yYWRpby9JUmFkaW9TZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlM2E2MS4uMDAwMDAwMAotLS0gYS9yYWRpby9JUmFkaW9TZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIkJwUmFkaW9TZXJ2aWNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgTElTVF9NT0RVTEVTID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBBVFRBQ0gsCi19OwotCi0jZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0Ci0KLWNsYXNzIEJwUmFkaW9TZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJhZGlvU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW9TZXJ2aWNlPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCi0gICAgewotICAgICAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIHByb3BlcnRpZXMgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgdWludDMyX3QgbnVtTW9kdWxlc1JlcSA9IChwcm9wZXJ0aWVzID09IE5VTEwpID8gMCA6ICpudW1Nb2R1bGVzOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtTW9kdWxlc1JlcSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX01PRFVMRVMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICpudW1Nb2R1bGVzID0gKHVpbnQzMl90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIHN0YXR1cyAlZCBnb3QgKm51bU1vZHVsZXMgJWQiLCBzdGF0dXMsICpudW1Nb2R1bGVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiAqbnVtTW9kdWxlcykgewotICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSAqbnVtTW9kdWxlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gMCkgewotICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQocHJvcGVydGllcywgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwotICAgICAgICBBTE9HVigiYXR0YWNoKCkgY29uZmlnICVwIHdpdGhBdWRpbyAlZCByZWdpb24gJWQgdHlwZSAlZCIsCi0gICAgICAgICAgICAgIGNvbmZpZyA9PSBOVUxMID8gMCA6IGNvbmZpZywgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICBjb25maWcgPT0gTlVMTCA/IDAgOiBjb25maWctPnJlZ2lvbiwKLSAgICAgICAgICAgICAgY29uZmlnID09IE5VTEwgPyAwIDogY29uZmlnLT5iYW5kLnR5cGUpOwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKHdpdGhBdWRpbyA/IDEgOiAwKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgIHJhZGlvID0gaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFJhZGlvU2VydmljZSwgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvU2VydmljZSIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBMSVNUX01PRFVMRVM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1Nb2R1bGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7Ci0gICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IG51bU1vZHVsZXMgPSBudW1Nb2R1bGVzUmVxOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMgPQotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKiljYWxsb2MobnVtTW9kdWxlc1JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0TW9kdWxlcyhwcm9wZXJ0aWVzLCAmbnVtTW9kdWxlcyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtTW9kdWxlcyk7Ci0gICAgICAgICAgICBBTE9HVigiTElTVF9NT0RVTEVTIHN0YXR1cyAlZCBnb3QgbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgbnVtTW9kdWxlcyk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IG51bU1vZHVsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IG51bU1vZHVsZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxICogc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVRUQUNIOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmFkaW9faGFuZGxlX3QgaGFuZGxlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNwPElSYWRpb0NsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgY29uZmlnOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWdQdHIgPSBOVUxMOwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgICAgICAgICAgY29uZmlnUHRyID0gJmNvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwotICAgICAgICAgICAgQUxPR1YoIkFUVEFDSCBjb25maWdQdHIgJXAgd2l0aEF1ZGlvICVkIiwgY29uZmlnUHRyLCB3aXRoQXVkaW8pOwotICAgICAgICAgICAgc3A8SVJhZGlvPiByYWRpbzsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaChoYW5kbGUsIGNsaWVudCwgY29uZmlnUHRyLCB3aXRoQXVkaW8sIHJhZGlvKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAocmFkaW8gIT0gMCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyYWRpbykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9SYWRpby5jcHAgYi9yYWRpby9SYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGQyMjEuLjAwMDAwMDAKLS0tIGEvcmFkaW8vUmFkaW8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi0jaW5jbHVkZSA8cmFkaW8vUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8cmFkaW8vUmFkaW9DYWxsYmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0gICAgc3A8SVJhZGlvU2VydmljZT4gICAgICAgICAgZ1JhZGlvU2VydmljZTsKLSAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBrUmFkaW9TZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCi0gICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAga1JhZGlvU2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5yYWRpbyI7Ci0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgZ0xvY2s7Ci0KLSAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgRGVhdGhOb3RpZmllcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJiaW5kZXJEaWVkIik7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgICAgICAgICAgZ1JhZGlvU2VydmljZS5jbGVhcigpOwotICAgICAgICAgICAgQUxPR1coIlJhZGlvIHNlcnZpY2UgZGllZCEiKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzcDxEZWF0aE5vdGlmaWVyPiAgICAgICAgIGdEZWF0aE5vdGlmaWVyOwotfTsgLy8gbmFtZXNwYWNlIGFub255bW91cwotCi1jb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiBSYWRpbzo6Z2V0UmFkaW9TZXJ2aWNlKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgIGlmIChnUmFkaW9TZXJ2aWNlLmdldCgpID09IDApIHsKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KGtSYWRpb1NlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dXKCJSYWRpb1NlcnZpY2Ugbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOwotICAgICAgICAgICAgdXNsZWVwKGtSYWRpb1NlcnZpY2VQb2xsRGVsYXkpOwotICAgICAgICB9IHdoaWxlKHRydWUpOwotICAgICAgICBpZiAoZ0RlYXRoTm90aWZpZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgZ0RlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOwotICAgICAgICB9Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0RlYXRoTm90aWZpZXIpOwotICAgICAgICBnUmFkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvU2VydmljZT4oYmluZGVyKTsKLSAgICB9Ci0gICAgQUxPR0VfSUYoZ1JhZGlvU2VydmljZSA9PSAwLCAibm8gUmFkaW9TZXJ2aWNlIT8iKTsKLSAgICByZXR1cm4gZ1JhZGlvU2VydmljZTsKLX0KLQotLy8gU3RhdGljIG1ldGhvZHMKLXN0YXR1c190IFJhZGlvOjpsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKLXsKLSAgICBBTE9HVigibGlzdE1vZHVsZXMoKSIpOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZS0+bGlzdE1vZHVsZXMocHJvcGVydGllcywgbnVtTW9kdWxlcyk7Ci19Ci0KLXNwPFJhZGlvPiBSYWRpbzo6YXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spCi17Ci0gICAgQUxPR1YoImF0dGFjaCgpIik7Ci0gICAgc3A8UmFkaW8+IHJhZGlvOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByYWRpbzsKLSAgICB9Ci0gICAgcmFkaW8gPSBuZXcgUmFkaW8oaGFuZGxlLCBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKGhhbmRsZSwgcmFkaW8sIGNvbmZpZywgd2l0aEF1ZGlvLCByYWRpby0+bUlSYWRpbyk7Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJhZGlvLT5tSVJhZGlvICE9IDApIHsKLSAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIocmFkaW8tPm1JUmFkaW8pLT5saW5rVG9EZWF0aChyYWRpbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gcmFkaW8gc2VydmljZSIsIHN0YXR1cyk7Ci0gICAgICAgIHJhZGlvLmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiByYWRpbzsKLX0KLQotCi0KLS8vIFJhZGlvCi1SYWRpbzo6UmFkaW8ocmFkaW9faGFuZGxlX3QgLypoYW5kbGUqLywgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mIGNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKQotewotfQotCi1SYWRpbzo6flJhZGlvKCkKLXsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgIH0KLX0KLQotCi12b2lkIFJhZGlvOjpkZXRhY2goKSB7Ci0gICAgQUxPR1YoImRldGFjaCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtSVJhZGlvKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbUlSYWRpbyA9IDA7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBSYWRpbzo6c2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPmdldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNldE11dGUobXV0ZSk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Z2V0TXV0ZShtdXRlKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJjaGFubmVsKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNjYW4oZGlyZWN0aW9uLCBza2lwU3ViY2hhbm5lbCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViY2hhbm5lbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zdGVwKGRpcmVjdGlvbiwgc2tpcFN1YmNoYW5uZWwpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6dHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+dHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmNhbmNlbCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Y2FuY2VsKCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oaW5mbyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+aGFzQ29udHJvbChoYXNDb250cm9sKTsKLX0KLQotCi0vLyBCcFJhZGlvQ2xpZW50Ci12b2lkIFJhZGlvOjpvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGV2ZW50IGxheW91dCBpbiBzaGFyZWQgbWVtb3J5IGlzOgotICAgIC8vIHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpIGJ5dGVzIDogdGhlIGV2ZW50IGl0c2VsZgotICAgIC8vIDQgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0YWRhdGEgc2l6ZSBvciAwCi0gICAgLy8gTiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBpZiBwcmVzZW50Ci0gICAgc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgcmFkaW9fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgKyBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9ICoodWludDMyX3QgKikoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0IC0gc2l6ZW9mKHVpbnQzMl90KSk7Ci0KLSAgICAvLyByZXN0b3JlIGxvY2FsIG1ldGFkYXRhIHBvaW50ZXIgZnJvbSBvZmZzZXQKLSAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+bWV0YWRhdGEgPQotICAgICAgICAgICAgICAgICAgICAocmFkaW9fbWV0YWRhdGFfdCAqKSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXZlbnQtPm1ldGFkYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KGV2ZW50KTsKLSAgICB9Ci19Ci0KLQotLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAotdm9pZCBSYWRpbzo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVygiUmFkaW8gc2VydmVyIGJpbmRlciBEaWVkICIpOwotICAgIG1JUmFkaW8gPSAwOwotICAgIHN0cnVjdCByYWRpb19ldmVudCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1NFUlZFUl9ESUVEOwotICAgIGV2ZW50LnN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoJmV2ZW50KTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9PV05FUlMgYi9zZXJ2aWNlcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwMGRjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL09XTkVSUwpAQCAtMCwwICsxLDQgQEAKK2VsYXVyZW50QGdvb2dsZS5jb20KK2V0YWx2YWxhQGdvb2dsZS5jb20KK2drYXN0ZW5AYW5kcm9pZC5jb20KK2h1bmdhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggYzRmMWFmMy4uYzEwZmEwNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTEzOCw3ICsxMzgsOCBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7Ci0gICAgTE9HX0hJU1RfRkxVU0goKTsKKyAgICAvLyBsb2cgdGhhdCBhdWRpbyB3YXMgdHVybmVkIG9uL29mZgorICAgIExPR19BVURJT19TVEFURSgpOwogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1QcmV2aW91czsKICAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCAyYTI3ZGZkLi4zNjZhMTY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NbWFwVHJhY2soKTsKIApAQCAtMzksNyArNDAsNyBAQAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAgICAgIHN0YXRpYyB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgTW1hcFRocmVhZDsKQEAgLTU1LDUgKzU2LDYgQEAKICAgICB2aXJ0dWFsIGludDY0X3QgZnJhbWVzUmVsZWFzZWQoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgb25UaW1lc3RhbXAoY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCk7CiAKKyAgICBwaWRfdCBtUGlkOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNlNGQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2h1bmdhQGdvb2dsZS5jb20KK2ptdHJpdmlAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGQ3YzA3MjguLjI3YzZkMzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTQ3NCw2ICs0NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CiAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpAQCAtNDk0LDYgKzQ5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwogICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCAzZjFhMGMwLi4xYzFhOTg5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMzAsNiArMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTQwLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CkBAIC0yNDAsNiArMjQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IDNmODNjYTguLmY4ZGE3ODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC01MCw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwpAQCAtMTAyLDYgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFJlY29yZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggNjVlY2NiNi4uNDU5ZTRmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMTU0NCw2ICsxNTQ0LDcgQEAKICAgICAgICAgQUxPR1coIkFjdGl2ZVRyYWNrczxUPjo6YWRkIHRyYWNrICVwIGFscmVhZHkgdGhlcmUiLCB0cmFjay5nZXQoKSk7CiAgICAgICAgIHJldHVybiBpbmRleDsKICAgICB9CisgICAgbG9nVHJhY2soImFkZCIsIHRyYWNrKTsKICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbisrOwogICAgIG1MYXRlc3RBY3RpdmVUcmFjayA9IHRyYWNrOwogICAgICsrbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOwpAQCAtMTU1Nyw2ICsxNTU4LDcgQEAKICAgICAgICAgQUxPR1coIkFjdGl2ZVRyYWNrczxUPjo6cmVtb3ZlIG5vbmV4aXN0ZW50IHRyYWNrICVwIiwgdHJhY2suZ2V0KCkpOwogICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQorICAgIGxvZ1RyYWNrKCJyZW1vdmUiLCB0cmFjayk7CiAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24rKzsKICAgICAtLW1CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKICAgICAvLyBtTGF0ZXN0QWN0aXZlVHJhY2sgaXMgbm90IGNsZWFyZWQgZXZlbiBpZiBpcyB0aGUgc2FtZSBhcyB0cmFjay4KQEAgLTE1NjcsNiArMTU2OSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6QWN0aXZlVHJhY2tzPFQ+OjpjbGVhcigpIHsKICAgICBmb3IgKGNvbnN0IHNwPFQ+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wQXVkaW8odHJhY2stPnVpZCgpKTsKKyAgICAgICAgbG9nVHJhY2soImNsZWFyIiwgdHJhY2spOwogICAgIH0KICAgICBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb24gPSBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbjsKICAgICBtQWN0aXZlVHJhY2tzLmNsZWFyKCk7CkBAIC0xNjA1LDYgKzE2MDgsMTYgQEAKICAgICB9CiB9CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkFjdGl2ZVRyYWNrczxUPjo6bG9nVHJhY2soCisgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lLCBjb25zdCBzcDxUPiAmdHJhY2spIGNvbnN0IHsKKyAgICBpZiAobUxvY2FsTG9nICE9IG51bGxwdHIpIHsKKyAgICAgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgZmFsc2UgLyogYWN0aXZlICovKTsKKyAgICAgICAgbUxvY2FsTG9nLT5sb2coIkFUOjolLTEwcyglcCkgJXMiLCBmdW5jTmFtZSwgdHJhY2suZ2V0KCksIHJlc3VsdC5zdHJpbmcoKSk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6YnJvYWRjYXN0X2woKQogewogICAgIC8vIFRocmVhZCBjb3VsZCBiZSBibG9ja2VkIHdhaXRpbmcgZm9yIGFzeW5jCkBAIC0xNjQwLDYgKzE2NTMsNyBAQAogICAgICAgICBtU3VzcGVuZGVkKDApLCBtQnl0ZXNXcml0dGVuKDApLAogICAgICAgICBtRnJhbWVzV3JpdHRlbigwKSwKICAgICAgICAgbVN1c3BlbmRlZEZyYW1lcygwKSwKKyAgICAgICAgbUFjdGl2ZVRyYWNrcygmdGhpcy0+bUxvY2FsTG9nKSwKICAgICAgICAgLy8gbVN0cmVhbVR5cGVzW10gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYm9keQogICAgICAgICBtT3V0cHV0KG91dHB1dCksCiAgICAgICAgIG1MYXN0V3JpdGVUaW1lKC0xKSwgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKSwKQEAgLTE3MDcsOCArMTcyMSw2IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIFN0cmVhbSB2b2x1bWVzIGluIGRCOiAiKTsKQEAgLTE3MzUsOCArMTc0NywxMCBAQAogICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKICAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKICAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwpAQCAtMTc0NSw4ICsxNzU5LDggQEAKICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBhY3RpdmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTE3NTQsMTUgKzE3NjgsMTUgQEAKICAgICB9CiAgICAgaWYgKG51bWFjdGl2ZXNlZW4gIT0gbnVtYWN0aXZlKSB7CiAgICAgICAgIC8vIHNvbWUgdHJhY2tzIGluIHRoZSBhY3RpdmUgbGlzdCB3ZXJlIG5vdCBpbiB0aGUgdHJhY2tzIGxpc3QKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjAxMyw3ICsyMDI3LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQpOwogCiAgICAgICAgIGxTdGF0dXMgPSB0cmFjayAhPSAwID8gdHJhY2stPmluaXRDaGVjaygpIDogKHN0YXR1c190KSBOT19NRU1PUlk7CkBAIC0yMTcyLDEwICsyMTg3LDYgQEAKICAgICAgICAgICAgIGNoYWluLT5pbmNBY3RpdmVUcmFja0NudCgpOwogICAgICAgICB9CiAKLSAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBhcnJheXNpemUoYnVmZmVyKSwgZmFsc2UgLyogYWN0aXZlICovKTsKLSAgICAgICAgbUxvY2FsTG9nLmxvZygiYWRkVHJhY2tfbCAgICAoJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOyAvLyBsb2cgZm9yIGFuYWx5c2lzCi0KICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgfQogCkBAIC0yMjAyLDkgKzIyMTMsOSBAQAogewogICAgIHRyYWNrLT50cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX1BSRVNFTlRBVElPTl9DT01QTEVURSk7CiAKLSAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tfbCAoJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOyAvLyBsb2cgZm9yIGFuYWx5c2lzCisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCByZXN1bHQuc3RyaW5nKCkpOwogCiAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIGRlbGV0ZVRyYWNrTmFtZV9sKHRyYWNrLT5uYW1lKCkpOwpAQCAtMzQwNCwxMCArMzQxNSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBpbmFjdGl2ZSBidXQgbm90IHRlcm1pbmF0ZWQKLSAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tzX2woJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTkyNSw3ICs1OTMyLDkgQEAKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDoKICAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCwgc3lzdGVtUmVhZHkpLAotICAgIG1JbnB1dChpbnB1dCksIG1Sc21wSW5CdWZmZXIoTlVMTCksCisgICAgbUlucHV0KGlucHV0KSwKKyAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpLAorICAgIG1Sc21wSW5CdWZmZXIoTlVMTCksCiAgICAgLy8gbVJzbXBJbkZyYW1lcywgbVJzbXBJbkZyYW1lc1AyLCBhbmQgbVJzbXBJbkZyYW1lc09BIGFyZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICBtUnNtcEluUmVhcigwKQogI2lmZGVmIFRFRV9TSU5LCkBAIC02Njk2LDcgKzY3MDUsOCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgICAgIHRyYWNrID0gbmV3IFJlY29yZFRyYWNrKHRoaXMsIGNsaWVudCwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBOVUxMLCBzZXNzaW9uSWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2Vzc2lvbklkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOwpAQCAtNjg4OCw2ICs2ODk4LDEwIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlbW92ZVRyYWNrX2woY29uc3Qgc3A8UmVjb3JkVHJhY2s+JiB0cmFjaykKIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIGZhbHNlIC8qIGFjdGl2ZSAqLyk7CisgICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tfbCAoJXApICVzIiwgdHJhY2suZ2V0KCksIHJlc3VsdC5zdHJpbmcoKSk7CisKICAgICBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CiAgICAgLy8gbmVlZCBhbnl0aGluZyByZWxhdGVkIHRvIGVmZmVjdHMgaGVyZT8KICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKQEAgLTY5MDEsNiArNjkxNSw4IEBACiAgICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAgICAgZHVtcFRyYWNrcyhmZCwgYXJncyk7CiAgICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7CisgICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7CisgICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTY5MTQsNiArNjkzMCwxMiBAQAogICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQorCisgICAgaWYgKGlucHV0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFsIHN0cmVhbSBkdW1wOlxuIik7CisgICAgICAgICh2b2lkKWlucHV0LT5zdHJlYW0tPmR1bXAoZmQpOworICAgIH0KKwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgY2FwdHVyZSB0aHJlYWQ6ICVzXG4iLCBoYXNGYXN0Q2FwdHVyZSgpID8gInllcyIgOiAibm8iKTsKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsYWJsZTogJXNcbiIsIG1GYXN0VHJhY2tBdmFpbCA/ICJ5ZXMiIDogIm5vIik7CiAKQEAgLTY5MjgsMTYgKzY5NTAsMTUgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0KICAgICBzaXplX3QgbnVtdHJhY2tzID0gbVRyYWNrcy5zaXplKCk7CiAgICAgc2l6ZV90IG51bWFjdGl2ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOwogICAgIHNpemVfdCBudW1hY3RpdmVzZWVuID0gMDsKICAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiICAgICI7CiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICV6dSBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOworICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CiAgICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwpAQCAtNjk0Niw4ICs2OTY3LDggQEAKICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBhY3RpdmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTY5NTUsMTUgKzY5NzYsMTUgQEAKICAgICB9CiAKICAgICBpZiAobnVtYWN0aXZlc2VlbiAhPSBudW1hY3RpdmUpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTc1NDUsNyArNzU2Niw4IEBACiAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmh3RGV2LCBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSwKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBNTUFQLCBzeXN0ZW1SZWFkeSksCi0gICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldikKKyAgICAgIG1IYWxTdHJlYW0oc3RyZWFtKSwgbUhhbERldmljZShod0Rldi0+aHdEZXZpY2UoKSksIG1BdWRpb0h3RGV2KGh3RGV2KSwKKyAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZykKIHsKICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgcmVhZEhhbFBhcmFtZXRlcnNfbCgpOwpAQCAtNzY5Myw3ICs3NzE1LDcgQEAKICAgICB9CiAKICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCwgcG9ydElkKTsKIAogICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKG1TZXNzaW9uSWQpOwpAQCAtODE3OCw2ICs4MjAwLDggQEAKICAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKICAgICBkdW1wVHJhY2tzKGZkLCBhcmdzKTsKICAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKKyAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTgxOTQsMTggKzgyMTgsMTcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOwotICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3MiLCBudW10cmFja3MpOworICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3NcbiIsIG51bXRyYWNrcyk7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIlxuIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCAwNjJiYWQ2Li4zMmYyYmM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTUwOCw5ICs1MDgsMTAgQEAKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICAgICAgICAgICAgICBjbGFzcyBBY3RpdmVUcmFja3MgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZlVHJhY2tzKCkKKyAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQgQWN0aXZlVHJhY2tzKFNpbXBsZUxvZyAqbG9jYWxMb2cgPSBudWxscHRyKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbigwKQogICAgICAgICAgICAgICAgICAgICAgICAgLCBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICwgbUxvY2FsTG9nKGxvY2FsTG9nKQogICAgICAgICAgICAgICAgICAgICB7IH0KIAogICAgICAgICAgICAgICAgICAgICB+QWN0aXZlVHJhY2tzKCkgewpAQCAtNTYyLDYgKzU2Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICB1cGRhdGVQb3dlclN0YXRlKHNwPFRocmVhZEJhc2U+IHRocmVhZCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgICAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBsb2dUcmFjayhjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3Qgc3A8VD4gJnRyYWNrKSBjb25zdDsKKwogICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8dWlkX3Q+IGdldFdha2VMb2NrVWlkcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3Rvcjx1aWRfdD4gd2FrZUxvY2tVaWRzOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcDxUPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CkBAIC01NzYsNiArNTc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIHdwPFQ+ICAgICAgICAgICAgICAgbUxhdGVzdEFjdGl2ZVRyYWNrOyAvLyBsYXRlc3QgdHJhY2sgYWRkZWQgdG8gQWN0aXZlVHJhY2tzCisgICAgICAgICAgICAgICAgICAgIFNpbXBsZUxvZyAqIGNvbnN0ICAgbUxvY2FsTG9nOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgbUxvY2FsTG9nOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGNiNTQwY2EuLmQ0Y2UwYjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTYxLDYgKzYxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQsCkBAIC04Miw2ICs4Myw3IEBACiAKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGdldEJ1ZmZlcnMoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyTWVtb3J5OyB9CiAgICAgICAgICAgICB2b2lkKiAgICAgICBidWZmZXIoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyOyB9CisgICAgICAgICAgICBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgPSAwOwogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQpAQCAtMTMzLDYgKzEzNSw0MCBAQAogICAgICAgICBtVGVybWluYXRlZCA9IHRydWU7CiAgICAgfQogCisgICAgLy8gVXBwZXIgY2FzZSBjaGFyYWN0ZXJzIGFyZSBmaW5hbCBzdGF0ZXMuCisgICAgLy8gTG93ZXIgY2FzZSBjaGFyYWN0ZXJzIGFyZSB0cmFuc2l0b3J5LgorICAgIGNvbnN0IGNoYXIgKmdldFRyYWNrU3RhdGVTdHJpbmcoKSBjb25zdCB7CisgICAgICAgIGlmIChpc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuICJUICI7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBJRExFOgorICAgICAgICAgICAgcmV0dXJuICJJICI7CisgICAgICAgIGNhc2UgU1RPUFBJTkdfMTogLy8gZm9yIEZhc3QgYW5kIE9mZmxvYWQKKyAgICAgICAgICAgIHJldHVybiAiczEiOworICAgICAgICBjYXNlIFNUT1BQSU5HXzI6IC8vIGZvciBGYXN0IGFuZCBPZmZsb2FkCisgICAgICAgICAgICByZXR1cm4gInMyIjsKKyAgICAgICAgY2FzZSBTVE9QUEVEOgorICAgICAgICAgICAgcmV0dXJuICJTICI7CisgICAgICAgIGNhc2UgUkVTVU1JTkc6CisgICAgICAgICAgICByZXR1cm4gInIgIjsKKyAgICAgICAgY2FzZSBBQ1RJVkU6CisgICAgICAgICAgICByZXR1cm4gIkEgIjsKKyAgICAgICAgY2FzZSBQQVVTSU5HOgorICAgICAgICAgICAgcmV0dXJuICJwICI7CisgICAgICAgIGNhc2UgUEFVU0VEOgorICAgICAgICAgICAgcmV0dXJuICJQICI7CisgICAgICAgIGNhc2UgRkxVU0hFRDoKKyAgICAgICAgICAgIHJldHVybiAiRiAiOworICAgICAgICBjYXNlIFNUQVJUSU5HXzE6IC8vIGZvciBSZWNvcmRUcmFjaworICAgICAgICAgICAgcmV0dXJuICJyMSI7CisgICAgICAgIGNhc2UgU1RBUlRJTkdfMjogLy8gZm9yIFJlY29yZFRyYWNrCisgICAgICAgICAgICByZXR1cm4gInIyIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiPyAiOworICAgICAgICB9CisgICAgfQorCiAgICAgYm9vbCBpc091dCgpIGNvbnN0IHsgcmV0dXJuIG1Jc091dDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBmb3IgVHJhY2ssIGZhbHNlIGZvciBSZWNvcmRUcmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgYSB0cmFjayB0eXBlIGlmIG5lZWRlZCBsYXRlcgpAQCAtMTQ0LDYgKzE4MCw3IEBACiAgICAgc3A8SU1lbW9yeT4gICAgICAgICBtQnVmZmVyTWVtb3J5OyAgLy8gY3VycmVudGx5IG5vbi0wIGZvciBmYXN0IFJlY29yZFRyYWNrIG9ubHkKICAgICB2b2lkKiAgICAgICAgICAgICAgIG1CdWZmZXI7ICAgIC8vIHN0YXJ0IG9mIHRyYWNrIGJ1ZmZlciwgdHlwaWNhbGx5IGluIHNoYXJlZCBtZW1vcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdCBmb3IgT3V0cHV0VHJhY2sgd2hlbiBpdCBpcyBpbiBsb2NhbCBtZW1vcnkKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAvLyBzaXplIG9mIG1CdWZmZXIgaW4gYnl0ZXMKICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCiAgICAgdHJhY2tfc3RhdGUgICAgICAgICBtU3RhdGU7CiAgICAgY29uc3QgdWludDMyX3QgICAgICBtU2FtcGxlUmF0ZTsgICAgLy8gaW5pdGlhbCBzYW1wbGUgcmF0ZSBvbmx5OyBmb3IgdHJhY2tzIHdoaWNoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDk3NjNiZjIuLjBmMjUxNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC01MCwxMCArNTAsNiBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAotLy8gVE9ETyBtb3ZlIHRvIGEgY29tbW9uIGhlYWRlciAgKEFsc28gc2hhcmVkIHdpdGggQXVkaW9UcmFjay5jcHApCi0jZGVmaW5lIE5BTk9TX1BFUl9TRUNPTkQgICAgMTAwMDAwMDAwMAotI2RlZmluZSBUSU1FX1RPX05BTk9TKHRpbWUpICgodWludDY0X3QpKHRpbWUpLnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQgKyAodGltZSkudHZfbnNlYykKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MSw2ICs2Nyw3IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgYm9vbCBpc091dCwKQEAgLTgxLDcgKzc4LDcgQEAKICAgICAgICAgbVRocmVhZCh0aHJlYWQpLAogICAgICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgICAgIG1DYmxrKE5VTEwpLAotICAgICAgICAvLyBtQnVmZmVyCisgICAgICAgIC8vIG1CdWZmZXIsIG1CdWZmZXJTaXplCiAgICAgICAgIG1TdGF0ZShJRExFKSwKICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCiAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKQEAgLTExMywxNSArMTEwLDIyIEBACiAKICAgICAvLyBBTE9HRCgiQ3JlYXRpbmcgdHJhY2sgd2l0aCAlZCBidWZmZXJzIEAgJWQgYnl0ZXMiLCBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSk7CiAKLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlciA9PSBOVUxMID8gcm91bmR1cChmcmFtZUNvdW50KSA6IGZyYW1lQ291bnQ7CisgICAgc2l6ZV90IG1pbkJ1ZmZlclNpemUgPSBidWZmZXIgPT0gTlVMTCA/IHJvdW5kdXAoZnJhbWVDb3VudCkgOiBmcmFtZUNvdW50OwogICAgIC8vIGNoZWNrIG92ZXJmbG93IHdoZW4gY29tcHV0aW5nIGJ1ZmZlclNpemUgZHVlIHRvIG11bHRpcGxpY2F0aW9uIGJ5IG1GcmFtZVNpemUuCi0gICAgaWYgKGJ1ZmZlclNpemUgPCBmcmFtZUNvdW50ICAvLyByb3VuZHVwIHJvdW5kcyBkb3duIGZvciB2YWx1ZXMgYWJvdmUgVUlOVF9NQVggLyAyCisgICAgaWYgKG1pbkJ1ZmZlclNpemUgPCBmcmFtZUNvdW50ICAvLyByb3VuZHVwIHJvdW5kcyBkb3duIGZvciB2YWx1ZXMgYWJvdmUgVUlOVF9NQVggLyAyCiAgICAgICAgICAgICB8fCBtRnJhbWVTaXplID09IDAgICAvLyBmb3JtYXQgbmVlZHMgdG8gYmUgY29ycmVjdAotICAgICAgICAgICAgfHwgYnVmZmVyU2l6ZSA+IFNJWkVfTUFYIC8gbUZyYW1lU2l6ZSkgeworICAgICAgICAgICAgfHwgbWluQnVmZmVyU2l6ZSA+IFNJWkVfTUFYIC8gbUZyYW1lU2l6ZSkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM0NzQ5NTcxIik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYnVmZmVyU2l6ZSAqPSBtRnJhbWVTaXplOworICAgIG1pbkJ1ZmZlclNpemUgKj0gbUZyYW1lU2l6ZTsKKworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBidWZmZXJTaXplID0gbWluQnVmZmVyU2l6ZTsgLy8gYWxsb2NhdGVkIGhlcmUuCisgICAgfSBlbHNlIGlmIChtaW5CdWZmZXJTaXplID4gYnVmZmVyU2l6ZSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM4MzQwMTE3Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgIGlmIChidWZmZXIgPT0gTlVMTCAmJiBhbGxvYyA9PSBBTExPQ19DQkxLKSB7CkBAIC0xNzcsNiArMTgxLDcgQEAKICAgICAgICAgICAgIC8vIEl0IHNob3VsZCByZWZlcmVuY2VzIHRoZSBidWZmZXIgdmlhIHRoZSBwaXBlLgogICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB0byBkZXRlY3QgaW5jb3JyZWN0IHVzYWdlIG9mIHRoZSBidWZmZXIsIHdlIHNldCBtQnVmZmVyIHRvIE5VTEwuCiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGJ1ZmZlclNpemUgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUxMT0NfQ0JMSzoKICAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBidWZmZXJzCkBAIC0xOTYsNyArMjAxLDEwIEBACiAgICAgICAgIGNhc2UgQUxMT0NfTk9ORToKICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIChpbnQpYWxsb2MpOwogICAgICAgICB9CisgICAgICAgIG1CdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKIAogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgIGlmIChtVGVlU2lua1RyYWNrRW5hYmxlZCkgewpAQCAtMzY4LDYgKzM3Niw3IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTM3Niw2ICszODUsNyBAQAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA6IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnNpemUoKSA6IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgdHJ1ZSAvKmlzT3V0Ki8sCiAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX1BBVENIKSA/ICggYnVmZmVyID09IE5VTEwgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpIDogQUxMT0NfQ0JMSywKICAgICAgICAgICAgICAgICAgIHR5cGUsIHBvcnRJZCksCkBAIC00MTEsMjEgKzQyMSw2IEBACiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIG1GcmFtZVNpemUsICFpc0V4dGVybmFsVHJhY2soKSwgc2FtcGxlUmF0ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gSXMgdGhlIHNoYXJlZCBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplPwotICAgICAgICAvLyAoZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpIGlzIDw9IFNJWkVfTUFYLCBjaGVja2VkIGluIFRyYWNrQmFzZS4KLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlci0+c2l6ZSgpIDwgZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpIHsKLSAgICAgICAgICAgIC8vIFdvcmthcm91bmQ6IGNsZWFyIG91dCBtQ2JsayB0byBpbmRpY2F0ZSB0cmFjayBoYXNuJ3QgYmVlbiBwcm9wZXJseSBjcmVhdGVkLgotICAgICAgICAgICAgbUNibGstPn5hdWRpb190cmFja19jYmxrX3QoKTsgICAvLyBkZXN0cm95IG91ciBzaGFyZWQtc3RydWN0dXJlLgotICAgICAgICAgICAgaWYgKG1DbGllbnQgPT0gMCkgewotICAgICAgICAgICAgICAgIGZyZWUobUNibGspOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNibGsgPSBOVUxMOwotCi0gICAgICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7IC8vIHJlbGVhc2Ugc2hhcmVkIGJ1ZmZlciBlYXJseQotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzODM0MDExNyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7CiAgICAgfQpAQCAtNTAzLDU4ICs0OTgsNDAgQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICAgTmFtZSBBY3RpdmUgQ2xpZW50IFR5cGUgICAgICBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBmQ291bnQgUyBGIFNSYXRlICAiCi0gICAgICAgICAgICAgICAgICAiTCBkQiAgUiBkQiAgVlMgZEIgICAgU2VydmVyIE1haW4gYnVmICBBdXggYnVmIEZsYWdzIFVuZEZybUNudCAgRmx1c2hlZFxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiVCBOYW1lIEFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAiCisgICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKKyAgICAgICAgICAgICAgICAgICJTVCAgTCBkQiAgUiBkQiAgVlMgZEIgIgorICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkICIKKyAgICAgICAgICAgICAgICAgICJNYWluIEJ1ZiAgQXV4IEJ1ZlxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKLSAgICBpZiAoaXNGYXN0VHJhY2soKSkgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBGICUyZCIsIG1GYXN0SW5kZXgpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPj0gQXVkaW9NaXhlcjo6VFJBQ0swKSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgICU0ZCIsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBub25lIik7Ci0gICAgfQotICAgIHRyYWNrX3N0YXRlIHN0YXRlID0gbVN0YXRlOwotICAgIGNoYXIgc3RhdGVDaGFyOwotICAgIGlmIChpc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICBzdGF0ZUNoYXIgPSAnVCc7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIElETEU6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnSSc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9QUElOR18xOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ3MnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBJTkdfMjoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICc1JzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUT1BQRUQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnUyc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVNVTUlORzoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdSJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFDVElWRToKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdBJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBBVVNJTkc6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAncCc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQVVTRUQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnUCc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGTFVTSEVEOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ0YnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnPyc7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBjaGFyIHRyYWNrVHlwZTsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgY2FzZSBUWVBFX0RFRkFVTFQ6CisgICAgY2FzZSBUWVBFX09VVFBVVDoKKyAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgdHJhY2tUeXBlID0gJ1MnOyAvLyBzdGF0aWMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNrVHlwZSA9ICcgJzsgLy8gbm9ybWFsCiAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX1BBVENIOgorICAgICAgICB0cmFja1R5cGUgPSAnUCc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRyYWNrVHlwZSA9ICc/JzsKICAgICB9CisKKyAgICBpZiAoaXNGYXN0VHJhY2soKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWMgJTNkIiwgdHJhY2tUeXBlLCBtRmFzdEluZGV4KTsKKyAgICB9IGVsc2UgaWYgKG1OYW1lID49IEF1ZGlvTWl4ZXI6OlRSQUNLMCkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyAlNGQiLCB0cmFja1R5cGUsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBub25lIiwgdHJhY2tUeXBlKTsKKyAgICB9CisKICAgICBjaGFyIG5vd0luVW5kZXJydW47CiAgICAgc3dpdGNoIChtT2JzZXJ2ZWRVbmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCkgewogICAgIGNhc2UgVU5ERVJSVU5fRlVMTDoKQEAgLTU3MSwzMSArNTQ4LDc1IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHN0ZDo6cGFpcjxmbG9hdCAvKiB2b2x1bWUgKi8sIGJvb2wgLyogYWN0aXZlICovPiB2c1ZvbHVtZSA9IG1Wb2x1bWVIYW5kbGVyLT5nZXRMYXN0Vm9sdW1lKCk7Ci0gICAgc25wcmludGYoJmJ1ZmZlcls4XSwgc2l6ZSAtIDgsICIgJTZzICU2dSAlNHUgJTA4WCAlMDhYICU3dSAlNnp1ICUxYyAlMWQgJTV1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiU1LjJnICU1LjJnICU1LjJnJWMgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4elggJTA4elggMHglMDNYICU5dSVjICU3dVxuIiwKKyAgICBjaGFyIGZpbGxpbmdTdGF0dXM7CisgICAgc3dpdGNoIChtRmlsbGluZ1VwU3RhdHVzKSB7CisgICAgY2FzZSBGU19JTlZBTElEOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ0knOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZTX0ZJTExJTkc6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnZic7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlNfRklMTEVEOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ0YnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZTX0FDVElWRToKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICdBJzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICc/JzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gY2xpcCBmcmFtZXNSZWFkeVNhZmUgdG8gbWF4IHJlcHJlc2VudGF0aW9uIGluIGR1bXAKKyAgICBjb25zdCBzaXplX3QgZnJhbWVzUmVhZHlTYWZlID0KKyAgICAgICAgICAgIHN0ZDo6bWluKG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5U2FmZSgpLCAoc2l6ZV90KTk5OTk5OTk5KTsKKworICAgIC8vIG9idGFpbiB2b2x1bWVzCisgICAgY29uc3QgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKKyAgICBjb25zdCBzdGQ6OnBhaXI8ZmxvYXQgLyogdm9sdW1lICovLCBib29sIC8qIGFjdGl2ZSAqLz4gdnNWb2x1bWUgPQorICAgICAgICAgICAgbVZvbHVtZUhhbmRsZXItPmdldExhc3RWb2x1bWUoKTsKKworICAgIC8vIE91ciBlZmZlY3RpdmUgZnJhbWUgY291bnQgaXMgb2J0YWluZWQgYnkgU2VydmVyUHJveHk6OmdldEJ1ZmZlclNpemVJbkZyYW1lcygpCisgICAgLy8gYXMgaXQgbWF5IGJlIHJlZHVjZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplSW5GcmFtZXMgPSAoc2l6ZV90KW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldEJ1ZmZlclNpemVJbkZyYW1lcygpOworICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlciBzaXplIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHRoZSBhcHAuCisgICAgY29uc3QgY2hhciBtb2RpZmllZEJ1ZmZlckNoYXIgPSBidWZmZXJTaXplSW5GcmFtZXMgPCBtRnJhbWVDb3VudAorICAgICAgICAgICAgPyAncicgLyogYnVmZmVyIHJlZHVjZWQgKi86IGJ1ZmZlclNpemVJbkZyYW1lcyA+IG1GcmFtZUNvdW50CisgICAgICAgICAgICAgICAgICAgID8gJ2UnIC8qIGVycm9yICovIDogJyAnIC8qIGlkZW50aWNhbCAqLzsKKworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU3cyAlNnUgJTd1ICUycyAweCUwM1ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUydSAlNS4yZyAlNS4yZyAlNS4yZyVjICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICU2enUlYyAlNnp1ICVjICU5dSVjICU3dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4elggJTA4elhcbiIsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKKyAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCisKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgbUZyYW1lQ291bnQsCi0gICAgICAgICAgICBzdGF0ZUNoYXIsCi0gICAgICAgICAgICBtRmlsbGluZ1VwU3RhdHVzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpLAorCisgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKHZzVm9sdW1lLmZpcnN0KSwgLy8gVm9sdW1lU2hhcGVyKHMpIHRvdGFsIHZvbHVtZQogICAgICAgICAgICAgdnNWb2x1bWUuc2Vjb25kID8gJ0EnIDogJyAnLCAgLy8gaWYgYW55IFZvbHVtZVNoYXBlcnMgYWN0aXZlCisKICAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAotICAgICAgICAgICAgKHNpemVfdCltTWFpbkJ1ZmZlciwgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4Ci0gICAgICAgICAgICAoc2l6ZV90KW1BdXhCdWZmZXIsICAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKLSAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCisgICAgICAgICAgICBidWZmZXJTaXplSW5GcmFtZXMsCisgICAgICAgICAgICBtb2RpZmllZEJ1ZmZlckNoYXIsCisgICAgICAgICAgICBmcmFtZXNSZWFkeVNhZmUsCisgICAgICAgICAgICBmaWxsaW5nU3RhdHVzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0VW5kZXJydW5GcmFtZXMoKSwKICAgICAgICAgICAgIG5vd0luVW5kZXJydW4sCi0gICAgICAgICAgICAodW5zaWduZWQpbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzRmx1c2hlZCgpICUgMTAwMDAwMDApOyAvLyA3IGRpZ2l0cworICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwLAorCisgICAgICAgICAgICAoc2l6ZV90KW1NYWluQnVmZmVyLCAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKKyAgICAgICAgICAgIChzaXplX3QpbUF1eEJ1ZmZlciAgIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAorICAgICAgICAgICAgKTsKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNhbXBsZVJhdGUoKSBjb25zdCB7CkBAIC0xMjM1LDcgKzEyNTYsOCBAQAogICAgICAgICAgICAgdWlkX3QgdWlkKQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX1BBVENILAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICBOVUxMLCAwLCBBVURJT19TRVNTSU9OX05PTkUsIHVpZCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCB1aWQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgIFRZUEVfT1VUUFVUKSwKICAgICBtQWN0aXZlKGZhbHNlKSwgbVNvdXJjZVRocmVhZChzb3VyY2VUaHJlYWQpCiB7CkBAIC0xMzUxLDcgKzEzNzMsOSBAQAogICAgICAgICAgICAgaWYgKG1CdWZmZXJRdWV1ZS5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUucmVtb3ZlQXQoMCk7CiAgICAgICAgICAgICAgICAgZnJlZShwSW5CdWZmZXItPm1CdWZmZXIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHBJbkJ1ZmZlciAhPSAmaW5CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBJbkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJXp1IiwgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDMwLDEwICsxNDU0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgYnVmZmVyLCAwLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCisgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSkpCiB7CiAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwpAQCAtMTU2NywxMyArMTU5MywxNCBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyppc091dCovLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLywKICAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfREVGQVVMVCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSA/IEFMTE9DX1BJUEUgOiBBTExPQ19DQkxLKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVmZmVyID09IE5VTEwpID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSwKQEAgLTE3MDEsMjIgKzE3MjgsMjggQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgIEFjdGl2ZSBDbGllbnQgRm10IENobiBtYXNrIFNlc3Npb24gUyAgIFNlcnZlciBmQ291bnQgU1JhdGVcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIkFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgICBTZXJ2ZXIgRnJtQ250XG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICAlNnMgJTZ1ICUzdSAlMDhYICU3dSAlMWQgJTA4WCAlNnp1ICU1dVxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyU1cyAlNnUgJTd1ICUycyAweCUwM1ggIgorICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgorICAgICAgICAgICAgIiUwOFggJTZ6dVxuIiwKKyAgICAgICAgICAgIGlzRmFzdFRyYWNrKCkgPyAnRicgOiAnICcsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCisgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAorCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgIG1TdGF0ZSwKLSAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAotICAgICAgICAgICAgbUZyYW1lQ291bnQsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKIAorICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCisgICAgICAgICAgICBtRnJhbWVDb3VudAorICAgICAgICAgICAgKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtMTc2Nyw5ICsxODAwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCiAgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBidWZmZXIsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSkpCiB7CiAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiByZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KQEAgLTE4MzQsMTEgKzE4NjgsMTUgQEAKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgTlVMTCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIDAsIE5VTEwsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAoc2l6ZV90KTAgLyogZnJhbWVDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKKyAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKiBpc091dCAqLywKICAgICAgICAgICAgICAgICAgIEFMTE9DX05PTkUsCi0gICAgICAgICAgICAgICAgICBUWVBFX0RFRkFVTFQsIHBvcnRJZCkKKyAgICAgICAgICAgICAgICAgIFRZUEVfREVGQVVMVCwgcG9ydElkKSwKKyAgICAgICAgbVBpZChwaWQpCiB7CiB9CiAKQEAgLTE4ODUsMTcgKzE5MjMsMTcgQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICAgQ2xpZW50IEZtdCBDaG4gbWFzayAgU1JhdGVcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIkNsaWVudCBTZXNzaW9uICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZVxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSBfX3VudXNlZCkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAgICAgICAgICAlNnUgJTN1ICAgICUwOFggJTV1XG4iLAotICAgICAgICAgICAgbVVpZCwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICUwOFggJTA4WCAlNnVcbiIsCisgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7Ci0KIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCAyZDg0MDI4Li45MDlhZjA5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtODgsMTEgKzg4LDExIEBACiAKIC8vIFdyaXRlIGhpc3RvZ3JhbSB0aW1lc3RhbXAgZW50cnkKICNkZWZpbmUgTE9HX0hJU1RfVFMoKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPmxvZ0hpc3RUUyhoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCisgICAgICAgIHgtPmxvZ0V2ZW50SGlzdFRzKE5CTG9nOjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsIGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKIAotLy8gZmx1c2ggYWxsIGhpc3RvZ3JhbQotI2RlZmluZSBMT0dfSElTVF9GTFVTSCgpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0+bG9nSGlzdEZsdXNoKGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKKy8vIFJlY29yZCB0aGF0IGF1ZGlvIHdhcyB0dXJuZWQgb24vb2ZmCisjZGVmaW5lIExPR19BVURJT19TVEFURSgpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nRXZlbnRIaXN0VHMoTkJMb2c6OkVWRU5UX0FVRElPX1NUQVRFLCBoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGV4dGVybiAiQyIgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKaW5kZXggYWQzNDBlNS4uNjU1NzFmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCkBAIC0yNCw3ICsyNCw4IEBACiAgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKICAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYmVmZmVjdHNjb25maWcKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCBjODY4MjA2Li43YjE5ZjU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTM0OSw4ICszNDksOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDgzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKQEAgLTAsMCArMSwzIEBACitqbXRyaXZpQGdvb2dsZS5jb20KK2tyb2NhcmRAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCmluZGV4IGNhMDcwY2YuLmNlZGYyMmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgogI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00NCwxNCArNDUsMTQgQEAKIAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCi0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbjsgfQotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCljb25zdCB7IHJldHVybiBtSW5wdXRTb3VyY2U7IH0KKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb247IH0KKyAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSgpY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc291cmNlOyB9CiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5mb3JtYXQ7IH0KICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5zYW1wbGVfcmF0ZTsgfQogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5jaGFubmVsX21hc2s7IH0KICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9Ci0gICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQotICAgIHZvaWQgc2V0VWlkKHVpZF90IHVpZCkgeyBtVWlkID0gdWlkOyB9CisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8udWlkOyB9CisgICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1SZWNvcmRDbGllbnRJbmZvLnVpZCA9IHVpZDsgfQogICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3Q7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1Jc1NvdW5kVHJpZ2dlcjsgfQogICAgIHVpbnQzMl90IG9wZW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1PcGVuQ291bnQ7IH0gOwpAQCAtNjUsMTEgKzY2LDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKLSAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBtSW5wdXRTb3VyY2U7CisgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgbVJlY29yZENsaWVudEluZm87CiAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1Db25maWc7CiAgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7Ci0gICAgdWlkX3QgbVVpZDsKICAgICBib29sICBtSXNTb3VuZFRyaWdnZXI7CiAgICAgdWludDMyX3QgIG1PcGVuQ291bnQ7CiAgICAgdWludDMyX3QgIG1BY3RpdmVDb3VudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCmluZGV4IGJlYTlmNGYuLjViNTdkM2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApAQCAtMzgsOSArMzgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKSA6Ci0gICAgbVNlc3Npb24oc2Vzc2lvbiksIG1JbnB1dFNvdXJjZShpbnB1dFNvdXJjZSksCisgICAgbVJlY29yZENsaWVudEluZm8oeyAudWlkID0gdWlkLCAuc2Vzc2lvbiA9IHNlc3Npb24sIC5zb3VyY2UgPSBpbnB1dFNvdXJjZX0pLAogICAgIG1Db25maWcoeyAuZm9ybWF0ID0gZm9ybWF0LCAuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlLCAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2t9KSwKLSAgICBtRmxhZ3MoZmxhZ3MpLCBtVWlkKHVpZCksIG1Jc1NvdW5kVHJpZ2dlcihpc1NvdW5kVHJpZ2dlciksCisgICAgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKICAgICBtT3BlbkNvdW50KDEpLCBtQWN0aXZlQ291bnQoMCksIG1Qb2xpY3lNaXgocG9saWN5TWl4KSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAogICAgIG1JbmZvUHJvdmlkZXIoTlVMTCkKIHsKQEAgLTkyLDcgKzkyLDcgQEAKICAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0UGF0Y2hIYW5kbGUoKSA6CiAgICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBtU2Vzc2lvbiwgbUlucHV0U291cmNlLAorICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmbVJlY29yZENsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLCAmZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDIsMTMgKzEwMiwxMyBAQAogCiBib29sIEF1ZGlvU2Vzc2lvbjo6bWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3QKIHsKLSAgICBpZiAob3RoZXItPnNlc3Npb24oKSA9PSBtU2Vzc2lvbiAmJgotICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtSW5wdXRTb3VyY2UgJiYKKyAgICBpZiAob3RoZXItPnNlc3Npb24oKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uICYmCisgICAgICAgIG90aGVyLT5pbnB1dFNvdXJjZSgpID09IG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZSAmJgogICAgICAgICBvdGhlci0+Zm9ybWF0KCkgPT0gbUNvbmZpZy5mb3JtYXQgJiYKICAgICAgICAgb3RoZXItPnNhbXBsZVJhdGUoKSA9PSBtQ29uZmlnLnNhbXBsZV9yYXRlICYmCiAgICAgICAgIG90aGVyLT5jaGFubmVsTWFzaygpID09IG1Db25maWcuY2hhbm5lbF9tYXNrICYmCiAgICAgICAgIG90aGVyLT5mbGFncygpID09IG1GbGFncyAmJgotICAgICAgICBvdGhlci0+dWlkKCkgPT0gbVVpZCkgeworICAgICAgICBvdGhlci0+dWlkKCkgPT0gbVJlY29yZENsaWVudEluZm8udWlkKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMzAsOCArMTMwLDcgQEAKICAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24sIG1JbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgJm1SZWNvcmRDbGllbnRJbmZvLCAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTQ0LDExICsxNDMsMTEgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIHNlc3Npb24gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzZXNzaW9uOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1TZXNzaW9uKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNlc3Npb246ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnVpZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaW5wdXQgc291cmNlOiAlZFxuIiwgc3BhY2VzLCAiIiwgbUlucHV0U291cmNlKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlucHV0IHNvdXJjZTogJWRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0OiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtQ29uZmlnLmZvcm1hdCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IGRiY2MwNzAuLjMxYzk1NzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTIyMCwxMSArMjIwLDExIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggNjU0NDY1ZC4uODRiMTA3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjAsOCArMjAsMTAgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzksMTEgKzQxLDE3IEBACiAKIEF1ZGlvUG9saWN5RWZmZWN0czo6QXVkaW9Qb2xpY3lFZmZlY3RzKCkKIHsKLSAgICAvLyBsb2FkIGF1dG9tYXRpYyBhdWRpbyBlZmZlY3QgbW9kdWxlcwotICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICBsb2FkQXVkaW9FZmZlY3RDb25maWcoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICBzdGF0dXNfdCBsb2FkUmVzdWx0ID0gbG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCk7CisgICAgaWYgKGxvYWRSZXN1bHQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gbG9hZCBYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24sIGZhbGxiYWNrIHRvIC5jb25mIik7CisgICAgICAgIC8vIGxvYWQgYXV0b21hdGljIGF1ZGlvIGVmZmVjdCBtb2R1bGVzCisgICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgICAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobG9hZFJlc3VsdCA+IDApIHsKKyAgICAgICAgQUxPR0UoIkVmZmVjdCBjb25maWcgaXMgcGFydGlhbGx5IGludmFsaWQsIHNraXBwZWQgJWQgZWxlbWVudHMiLCBsb2FkUmVzdWx0KTsKICAgICB9CiB9CiAKQEAgLTY4NSw2ICs2OTMsMjggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCkgeworICAgIGF1dG8gcmVzdWx0ID0gZWZmZWN0c0NvbmZpZzo6cGFyc2UoKTsKKyAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIGF1dG8gbG9hZFByb2Nlc3NpbmdDaGFpbiA9IFtdKGF1dG8mIHByb2Nlc3NpbmdDaGFpbiwgYXV0byYgc3RyZWFtcykgeworICAgICAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IHByb2Nlc3NpbmdDaGFpbikgeworICAgICAgICAgICAgYXV0byBlZmZlY3REZXNjcyA9IHN0ZDo6bWFrZV91bmlxdWU8RWZmZWN0RGVzY1ZlY3Rvcj4oKTsKKyAgICAgICAgICAgIGZvciAoYXV0byYgZWZmZWN0IDogc3RyZWFtLmVmZmVjdHMpIHsKKyAgICAgICAgICAgICAgICBlZmZlY3REZXNjcy0+bUVmZmVjdHMuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVmZmVjdERlc2N7ZWZmZWN0LmdldCgpLm5hbWUuY19zdHIoKSwgZWZmZWN0LmdldCgpLnV1aWR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbXMuYWRkKHN0cmVhbS50eXBlLCBlZmZlY3REZXNjcy5yZWxlYXNlKCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBsb2FkUHJvY2Vzc2luZ0NoYWluKHJlc3VsdC5wYXJzZWRDb25maWctPnByZXByb2Nlc3MsIG1JbnB1dFNvdXJjZXMpOworICAgIGxvYWRQcm9jZXNzaW5nQ2hhaW4ocmVzdWx0LnBhcnNlZENvbmZpZy0+cG9zdHByb2Nlc3MsIG1PdXRwdXRTdHJlYW1zKTsKKyAgICAvLyBDYXN0aW5nIGZyb20gc3NpemVfdCB0byBzdGF0dXNfdCBpcyBwcm9iYWJseSBzYWZlLCB0aGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAyXjMxIGVycm9ycworICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudDsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkQXVkaW9FZmZlY3RDb25maWcoY29uc3QgY2hhciAqcGF0aCkKIHsKICAgICBjbm9kZSAqcm9vdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDBjNzRkODcuLjU5ZDVkMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtMTU1LDcgKzE1NSw4IEBACiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1OYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgLy8gUGFyc2UgYXVkaW9fZWZmZWN0cy5jb25mCi0gICAgc3RhdHVzX3QgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdENvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsgLy8gVE9ETzogYWRkIGxlZ2FjeSBpbiB0aGUgbmFtZQorICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdFhtbENvbmZpZygpOyAvLyBUT0RPOiByZW1vdmUgIlhtbCIgaW4gdGhlIG5hbWUKIAogICAgIC8vIExvYWQgYWxsIGVmZmVjdHMgZGVzY3JpcHRvcnMgaW4gY29uZmlndXJhdGlvbiBmaWxlCiAgICAgc3RhdHVzX3QgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggYzRmNjM2Ny4uYjQxNzYzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMTg1LDIxICsxODUsMjEgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KIH0KQEAgLTI2NywxMiArMjY3LDEyIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgewotICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQogfQpAQCAtNTQ0LDggKzU0NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsIGRhdGEtPm1TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Tb3VyY2UsICZkYXRhLT5tQ2xpZW50Q29uZmlnLCAmZGF0YS0+bURldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsICZkYXRhLT5tQ2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtODEwLDcgKzgxMCw3IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKQEAgLTgxOCwxNCArODE4LDEzIEBACiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU7CiAgICAgUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZURhdGEgKmRhdGEgPSBuZXcgUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZURhdGEoKTsKICAgICBkYXRhLT5tRXZlbnQgPSBldmVudDsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgZGF0YS0+bVNvdXJjZSA9IHNvdXJjZTsKKyAgICBkYXRhLT5tQ2xpZW50SW5mbyA9ICpjbGllbnRJbmZvOwogICAgIGRhdGEtPm1DbGllbnRDb25maWcgPSAqY2xpZW50Q29uZmlnOwogICAgIGRhdGEtPm1EZXZpY2VDb25maWcgPSAqZGV2aWNlQ29uZmlnOwogICAgIGRhdGEtPm1QYXRjaEhhbmRsZSA9IHBhdGNoSGFuZGxlOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBldmVudCwgc291cmNlKTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlY29yZGluZyBjb25maWd1cmF0aW9uIHVwZGF0ZSBldmVudCAlZCwgc291cmNlICVkIHVpZCAldSIsCisgICAgICAgICAgICBldmVudCwgY2xpZW50SW5mby0+c291cmNlLCBjbGllbnRJbmZvLT51aWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCAzNTU0MmYxLi4zOGQ0YjE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIyOCwxMSArMjI4LDExIEBACiAKICAgICAgICAgICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgdm9pZCBkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKIHByaXZhdGU6CkBAIC0zMDYsOCArMzA2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwpAQCAtNDA0LDggKzQwNCw3IEBACiAgICAgICAgIGNsYXNzIFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBpbnQgbUV2ZW50OwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKKyAgICAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1DbGllbnRJbmZvOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1DbGllbnRDb25maWc7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbURldmljZUNvbmZpZzsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKQEAgLTUxOCw3ICs1MTcsNyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKQEAgLTU0MCw4ICs1MzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvT1dORVJTIGIvc2VydmljZXMvY2FtZXJhL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFjZmVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL09XTkVSUwpAQCAtMCwwICsxLDYgQEAKK2N5Y2hlbkBnb29nbGUuY29tCitlcGVldkBnb29nbGUuY29tCitldGFsdmFsYUBnb29nbGUuY29tCitzaHV6aGVud2FuZ0Bnb29nbGUuY29tCit5aW5jaGlheWVoQGdvb2dsZS5jb20KK3poaWp1bmhlQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCmluZGV4IDg3NmM2ODUuLmYzYmIzNWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcApAQCAtNDA0LDYgKzQwNCw4IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHVtcFJlY2VudChyZXN1bHQsIHRzX3NpbmNlLCBvbmx5KTsKICAgICB9CisgICAgZnJlZSgodm9pZCopb25seSk7CisgICAgb25seT1OVUxMOwogCiAKICAgICBpZiAoY2xlYXIpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaAppbmRleCBkNjRkZWJiLi4wZDJjOWQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5oCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oPgotI2luY2x1ZGUgPGluY2x1ZGUvT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvT1dORVJTIGIvc2VydmljZXMvbWVkaWFjb2RlYy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxNmNjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAoramVmZnZAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCmluZGV4IGM1OTk0NGEuLjc5ZDZkYTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCkBAIC0zMiw4ICszMiw4IEBACiAjaW5jbHVkZSAibWluaWphaWwuaCIKIAogI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxvbXgvMS4wL09teC5oPgotI2luY2x1ZGUgPG9teC8xLjAvT214U3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCmluZGV4IDZiMzBkYjYuLjJkYWE4MjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawpAQCAtMTcsNyArMTcsNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBNZWRpYUNhc1NlcnZpY2UuY3BwIFwKICAgICBNZWRpYURybVNlcnZpY2UuY3BwIFwKICAgICBtYWluX21lZGlhZHJtc2VydmVyLmNwcAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9GYWN0b3J5TG9hZGVyLmggYi9zZXJ2aWNlcy9tZWRpYWRybS9GYWN0b3J5TG9hZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjExMTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0NBU19MT0FERVJfSF8KLSNkZWZpbmUgTUVESUFfQ0FTX0xPQURFUl9IXwotCi0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxtZWRpYS9TaGFyZWRMaWJyYXJ5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwotdXNpbmcgbmFtZXNwYWNlIE1lZGlhQ2FzOwotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNsYXNzIEZhY3RvcnlMb2FkZXIgewotcHVibGljOgotICAgIEZhY3RvcnlMb2FkZXIoY29uc3QgY2hhciAqbmFtZSkgOgotICAgICAgICBtRmFjdG9yeShOVUxMKSwgbUNyZWF0ZUZhY3RvcnlGdW5jTmFtZShuYW1lKSB7fQotCi0gICAgdmlydHVhbCB+RmFjdG9yeUxvYWRlcigpIHsgY2xvc2VGYWN0b3J5KCk7IH0KLQotICAgIGJvb2wgZmluZEZhY3RvcnlGb3JTY2hlbWUoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKLSAgICAgICAgICAgIHNwPFNoYXJlZExpYnJhcnk+ICpsaWJyYXJ5ID0gTlVMTCwKLSAgICAgICAgICAgIFQqKiBmYWN0b3J5ID0gTlVMTCk7Ci0KLSAgICBib29sIGVudW1lcmF0ZVBsdWdpbnModmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cyk7Ci0KLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBUKigqQ3JlYXRlRmFjdG9yeUZ1bmMpKCk7Ci0KLSAgICBNdXRleCBtTWFwTG9jazsKLSAgICBUKiBtRmFjdG9yeTsKLSAgICBjb25zdCBjaGFyICptQ3JlYXRlRmFjdG9yeUZ1bmNOYW1lOwotICAgIHNwPFNoYXJlZExpYnJhcnk+IG1MaWJyYXJ5OwotICAgIEtleWVkVmVjdG9yPGludDMyX3QsIFN0cmluZzg+IG1DQVN5c3RlbUlkVG9MaWJyYXJ5UGF0aE1hcDsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCB3cDxTaGFyZWRMaWJyYXJ5PiA+IG1MaWJyYXJ5UGF0aFRvT3BlbkxpYnJhcnlNYXA7Ci0KLSAgICBib29sIGxvYWRGYWN0b3J5Rm9yU2NoZW1lRnJvbVBhdGgoCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZwYXRoLAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgICAgICBzcDxTaGFyZWRMaWJyYXJ5PiAqbGlicmFyeSwKLSAgICAgICAgICAgIFQqKiBmYWN0b3J5KTsKLQotICAgIGJvb2wgcXVlcnlQbHVnaW5zRnJvbVBhdGgoCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZwYXRoLAotICAgICAgICAgICAgdmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cyk7Ci0KLSAgICBib29sIG9wZW5GYWN0b3J5KGNvbnN0IFN0cmluZzggJnBhdGgpOwotICAgIHZvaWQgY2xvc2VGYWN0b3J5KCk7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6ZmluZEZhY3RvcnlGb3JTY2hlbWUoCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBzcDxTaGFyZWRMaWJyYXJ5PiAqbGlicmFyeSwgVCoqIGZhY3RvcnkpIHsKLSAgICBpZiAobGlicmFyeSAhPSBOVUxMKSB7Ci0gICAgICAgIGxpYnJhcnktPmNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgKmZhY3RvcnkgPSBOVUxMOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTWFwTG9jayk7Ci0KLSAgICAvLyBmaXJzdCBjaGVjayBjYWNoZQotICAgIHNzaXplX3QgaW5kZXggPSBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXAuaW5kZXhPZktleShDQV9zeXN0ZW1faWQpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIHJldHVybiBsb2FkRmFjdG9yeUZvclNjaGVtZUZyb21QYXRoKAotICAgICAgICAgICAgICAgIG1DQVN5c3RlbUlkVG9MaWJyYXJ5UGF0aE1hcFtpbmRleF0sCi0gICAgICAgICAgICAgICAgQ0Ffc3lzdGVtX2lkLCBsaWJyYXJ5LCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvLyBubyBsdWNrLCBoYXZlIHRvIHNlYXJjaAotICAgIFN0cmluZzggZGlyUGF0aCgiL3N5c3RlbS9saWIvbWVkaWFjYXMiKTsKLSAgICBESVIqIHBEaXIgPSBvcGVuZGlyKGRpclBhdGguc3RyaW5nKCkpOwotCi0gICAgaWYgKHBEaXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gcGx1Z2luIGRpcmVjdG9yeSAlcyIsIGRpclBhdGguc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RydWN0IGRpcmVudCogcEVudHJ5OwotICAgIHdoaWxlICgocEVudHJ5ID0gcmVhZGRpcihwRGlyKSkpIHsKLSAgICAgICAgU3RyaW5nOCBwbHVnaW5QYXRoID0gZGlyUGF0aCArICIvIiArIHBFbnRyeS0+ZF9uYW1lOwotICAgICAgICBpZiAocGx1Z2luUGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCkgPT0gIi5zbyIpIHsKLSAgICAgICAgICAgIGlmIChsb2FkRmFjdG9yeUZvclNjaGVtZUZyb21QYXRoKAotICAgICAgICAgICAgICAgICAgICBwbHVnaW5QYXRoLCBDQV9zeXN0ZW1faWQsIGxpYnJhcnksIGZhY3RvcnkpKSB7Ci0gICAgICAgICAgICAgICAgbUNBU3lzdGVtSWRUb0xpYnJhcnlQYXRoTWFwLmFkZChDQV9zeXN0ZW1faWQsIHBsdWdpblBhdGgpOwotICAgICAgICAgICAgICAgIGNsb3NlZGlyKHBEaXIpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbG9zZWRpcihwRGlyKTsKLQotICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBwbHVnaW4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBGYWN0b3J5TG9hZGVyPFQ+OjplbnVtZXJhdGVQbHVnaW5zKAotICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgQUxPR0koImVudW1lcmF0ZVBsdWdpbnMiKTsKLQotICAgIHJlc3VsdHMtPmNsZWFyKCk7Ci0KLSAgICBTdHJpbmc4IGRpclBhdGgoIi9zeXN0ZW0vbGliL21lZGlhY2FzIik7Ci0gICAgRElSKiBwRGlyID0gb3BlbmRpcihkaXJQYXRoLnN0cmluZygpKTsKLQotICAgIGlmIChwRGlyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHBsdWdpbiBkaXJlY3RvcnkgJXMiLCBkaXJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTWFwTG9jayk7Ci0KLSAgICBzdHJ1Y3QgZGlyZW50KiBwRW50cnk7Ci0gICAgd2hpbGUgKChwRW50cnkgPSByZWFkZGlyKHBEaXIpKSkgewotICAgICAgICBTdHJpbmc4IHBsdWdpblBhdGggPSBkaXJQYXRoICsgIi8iICsgcEVudHJ5LT5kX25hbWU7Ci0gICAgICAgIGlmIChwbHVnaW5QYXRoLmdldFBhdGhFeHRlbnNpb24oKSA9PSAiLnNvIikgewotICAgICAgICAgICAgcXVlcnlQbHVnaW5zRnJvbVBhdGgocGx1Z2luUGF0aCwgcmVzdWx0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBGYWN0b3J5TG9hZGVyPFQ+Ojpsb2FkRmFjdG9yeUZvclNjaGVtZUZyb21QYXRoKAotICAgICAgICBjb25zdCBTdHJpbmc4ICZwYXRoLCBpbnQzMl90IENBX3N5c3RlbV9pZCwKLSAgICAgICAgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksIFQqKiBmYWN0b3J5KSB7Ci0gICAgY2xvc2VGYWN0b3J5KCk7Ci0KLSAgICBpZiAoIW9wZW5GYWN0b3J5KHBhdGgpIHx8ICFtRmFjdG9yeS0+aXNTeXN0ZW1JZFN1cHBvcnRlZChDQV9zeXN0ZW1faWQpKSB7Ci0gICAgICAgIGNsb3NlRmFjdG9yeSgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGxpYnJhcnkgIT0gTlVMTCkgewotICAgICAgICAqbGlicmFyeSA9IG1MaWJyYXJ5OwotICAgIH0KLSAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICpmYWN0b3J5ID0gbUZhY3Rvcnk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6cXVlcnlQbHVnaW5zRnJvbVBhdGgoCi0gICAgICAgIGNvbnN0IFN0cmluZzggJnBhdGgsIHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpIHsKLSAgICBjbG9zZUZhY3RvcnkoKTsKLQotICAgIHZlY3RvcjxDYXNQbHVnaW5EZXNjcmlwdG9yPiBkZXNjcmlwdG9yczsKLSAgICBpZiAoIW9wZW5GYWN0b3J5KHBhdGgpIHx8IG1GYWN0b3J5LT5xdWVyeVBsdWdpbnMoJmRlc2NyaXB0b3JzKSAhPSBPSykgewotICAgICAgICBjbG9zZUZhY3RvcnkoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoYXV0byBpdCA9IGRlc2NyaXB0b3JzLmJlZ2luKCk7IGl0ICE9IGRlc2NyaXB0b3JzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIHJlc3VsdHMtPnB1c2hfYmFjayhQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBpdC0+Q0Ffc3lzdGVtX2lkLCBpdC0+bmFtZSkpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46Om9wZW5GYWN0b3J5KGNvbnN0IFN0cmluZzggJnBhdGgpIHsKLSAgICAvLyBnZXQgc3Ryb25nIHBvaW50ZXIgdG8gb3BlbiBzaGFyZWQgbGlicmFyeQotICAgIHNzaXplX3QgaW5kZXggPSBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwLmluZGV4T2ZLZXkocGF0aCk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgbUxpYnJhcnkgPSBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwW2luZGV4XS5wcm9tb3RlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZXggPSBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwLmFkZChwYXRoLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1MaWJyYXJ5LmdldCgpKSB7Ci0gICAgICAgIG1MaWJyYXJ5ID0gbmV3IFNoYXJlZExpYnJhcnkocGF0aCk7Ci0gICAgICAgIGlmICghKm1MaWJyYXJ5KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwLnJlcGxhY2VWYWx1ZUF0KGluZGV4LCBtTGlicmFyeSk7Ci0gICAgfQotCi0gICAgQ3JlYXRlRmFjdG9yeUZ1bmMgY3JlYXRlRmFjdG9yeSA9Ci0gICAgICAgIChDcmVhdGVGYWN0b3J5RnVuYyltTGlicmFyeS0+bG9va3VwKG1DcmVhdGVGYWN0b3J5RnVuY05hbWUpOwotICAgIGlmIChjcmVhdGVGYWN0b3J5ID09IE5VTEwgfHwgKG1GYWN0b3J5ID0gY3JlYXRlRmFjdG9yeSgpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBGYWN0b3J5TG9hZGVyPFQ+OjpjbG9zZUZhY3RvcnkoKSB7Ci0gICAgZGVsZXRlIG1GYWN0b3J5OwotICAgIG1GYWN0b3J5ID0gTlVMTDsKLSAgICBtTGlicmFyeS5jbGVhcigpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBNRURJQV9DQVNfTE9BREVSX0hfCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExMTI4My4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQ2FzU2VydmljZSIKLQotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvQ2FzQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQ2FzSW1wbC5oPgotI2luY2x1ZGUgPG1lZGlhL0Rlc2NyYW1ibGVySW1wbC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLSNpbmNsdWRlICJNZWRpYUNhc1NlcnZpY2UuaCIKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vc3RhdGljCi12b2lkIE1lZGlhQ2FzU2VydmljZTo6aW5zdGFudGlhdGUoKSB7Ci0gICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoCi0gICAgICAgICAgICBTdHJpbmcxNigibWVkaWEuY2FzIiksIG5ldyBNZWRpYUNhc1NlcnZpY2UoKSk7Ci19Ci0KLU1lZGlhQ2FzU2VydmljZTo6TWVkaWFDYXNTZXJ2aWNlKCkgOgotICAgIG1DYXNMb2FkZXIobmV3IEZhY3RvcnlMb2FkZXI8Q2FzRmFjdG9yeT4oImNyZWF0ZUNhc0ZhY3RvcnkiKSksCi0gICAgbURlc2NyYW1ibGVyTG9hZGVyKG5ldyBGYWN0b3J5TG9hZGVyPERlc2NyYW1ibGVyRmFjdG9yeT4oCi0gICAgICAgICAgICAiY3JlYXRlRGVzY3JhbWJsZXJGYWN0b3J5IikpIHsKLX0KLQotTWVkaWFDYXNTZXJ2aWNlOjp+TWVkaWFDYXNTZXJ2aWNlKCkgewotICAgIGRlbGV0ZSBtQ2FzTG9hZGVyOwotICAgIGRlbGV0ZSBtRGVzY3JhbWJsZXJMb2FkZXI7Ci19Ci0KLVN0YXR1cyBNZWRpYUNhc1NlcnZpY2U6OmVudW1lcmF0ZVBsdWdpbnMoCi0gICAgICAgIHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpIHsKLSAgICBBTE9HVigiZW51bWVyYXRlUGx1Z2lucyIpOwotCi0gICAgbUNhc0xvYWRlci0+ZW51bWVyYXRlUGx1Z2lucyhyZXN1bHRzKTsKLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYUNhc1NlcnZpY2U6OmlzU3lzdGVtSWRTdXBwb3J0ZWQoCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBib29sKiByZXN1bHQpIHsKLSAgICBBTE9HVigiaXNTeXN0ZW1JZFN1cHBvcnRlZDogQ0Ffc3lzdGVtX2lkPSVkIiwgQ0Ffc3lzdGVtX2lkKTsKLQotICAgICpyZXN1bHQgPSBtQ2FzTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZShDQV9zeXN0ZW1faWQpOwotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhQ2FzU2VydmljZTo6Y3JlYXRlUGx1Z2luKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKLSAgICAgICAgY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIsCi0gICAgICAgIHNwPElDYXM+KiByZXN1bHQpIHsKLSAgICBBTE9HVigiY3JlYXRlUGx1Z2luOiBDQV9zeXN0ZW1faWQ9JWQiLCBDQV9zeXN0ZW1faWQpOwotCi0gICAgcmVzdWx0LT5jbGVhcigpOwotCi0gICAgQ2FzRmFjdG9yeSAqZmFjdG9yeTsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBsaWJyYXJ5OwotICAgIGlmIChtQ2FzTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZShDQV9zeXN0ZW1faWQsICZsaWJyYXJ5LCAmZmFjdG9yeSkpIHsKLSAgICAgICAgQ2FzUGx1Z2luICpwbHVnaW4gPSBOVUxMOwotICAgICAgICBzcDxDYXNJbXBsPiBjYXNJbXBsID0gbmV3IENhc0ltcGwobGlzdGVuZXIpOwotICAgICAgICBpZiAoZmFjdG9yeS0+Y3JlYXRlUGx1Z2luKENBX3N5c3RlbV9pZCwgKHVpbnQ2NF90KWNhc0ltcGwuZ2V0KCksCi0gICAgICAgICAgICAgICAgJkNhc0ltcGw6Ok9uRXZlbnQsICZwbHVnaW4pID09IE9LICYmIHBsdWdpbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjYXNJbXBsLT5pbml0KGxpYnJhcnksIHBsdWdpbik7Ci0gICAgICAgICAgICAqcmVzdWx0ID0gY2FzSW1wbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYUNhc1NlcnZpY2U6OmlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQoCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBib29sKiByZXN1bHQpIHsKLSAgICBBTE9HVigiaXNEZXNjcmFtYmxlclN1cHBvcnRlZDogQ0Ffc3lzdGVtX2lkPSVkIiwgQ0Ffc3lzdGVtX2lkKTsKLQotICAgICpyZXN1bHQgPSBtRGVzY3JhbWJsZXJMb2FkZXItPmZpbmRGYWN0b3J5Rm9yU2NoZW1lKENBX3N5c3RlbV9pZCk7Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjpjcmVhdGVEZXNjcmFtYmxlcigKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIHNwPElEZXNjcmFtYmxlcj4qIHJlc3VsdCkgewotICAgIEFMT0dWKCJjcmVhdGVEZXNjcmFtYmxlcjogQ0Ffc3lzdGVtX2lkPSVkIiwgQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJlc3VsdC0+Y2xlYXIoKTsKLQotICAgIERlc2NyYW1ibGVyRmFjdG9yeSAqZmFjdG9yeTsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBsaWJyYXJ5OwotICAgIGlmIChtRGVzY3JhbWJsZXJMb2FkZXItPmZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICAgICAgQ0Ffc3lzdGVtX2lkLCAmbGlicmFyeSwgJmZhY3RvcnkpKSB7Ci0gICAgICAgIERlc2NyYW1ibGVyUGx1Z2luICpwbHVnaW4gPSBOVUxMOwotICAgICAgICBpZiAoZmFjdG9yeS0+Y3JlYXRlUGx1Z2luKENBX3N5c3RlbV9pZCwgJnBsdWdpbikgPT0gT0sKLSAgICAgICAgICAgICAgICAmJiBwbHVnaW4gIT0gTlVMTCkgewotICAgICAgICAgICAgKnJlc3VsdCA9IG5ldyBEZXNjcmFtYmxlckltcGwobGlicmFyeSwgcGx1Z2luKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiODI4ZjIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9DQVNfU0VSVklDRV9IXwotI2RlZmluZSBNRURJQV9DQVNfU0VSVklDRV9IXwotCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhQ2FzU2VydmljZS5oPgotCi0jaW5jbHVkZSAiRmFjdG9yeUxvYWRlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXN0cnVjdCBDYXNGYWN0b3J5Owotc3RydWN0IERlc2NyYW1ibGVyRmFjdG9yeTsKLQotY2xhc3MgTWVkaWFDYXNTZXJ2aWNlIDogcHVibGljIEJuTWVkaWFDYXNTZXJ2aWNlIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgdm9pZCBpbnN0YW50aWF0ZSgpOwotCi0gICAgdmlydHVhbCBTdGF0dXMgZW51bWVyYXRlUGx1Z2lucygKLSAgICAgICAgICAgIHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgaXNTeXN0ZW1JZFN1cHBvcnRlZCgKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBib29sKiByZXN1bHQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgY3JlYXRlUGx1Z2luKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgICAgICBjb25zdCBzcDxJQ2FzTGlzdGVuZXI+ICZsaXN0ZW5lciwKLSAgICAgICAgICAgIHNwPElDYXM+KiByZXN1bHQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgaXNEZXNjcmFtYmxlclN1cHBvcnRlZCgKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBib29sKiByZXN1bHQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgY3JlYXRlRGVzY3JhbWJsZXIoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgc3A8SURlc2NyYW1ibGVyPiogcmVzdWx0KSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBGYWN0b3J5TG9hZGVyPENhc0ZhY3Rvcnk+ICptQ2FzTG9hZGVyOwotICAgIEZhY3RvcnlMb2FkZXI8RGVzY3JhbWJsZXJGYWN0b3J5PiAqbURlc2NyYW1ibGVyTG9hZGVyOwotCi0gICAgTWVkaWFDYXNTZXJ2aWNlKCk7Ci0gICAgdmlydHVhbCB+TWVkaWFDYXNTZXJ2aWNlKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBNRURJQV9DQVNfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vT1dORVJTIGIvc2VydmljZXMvbWVkaWFkcm0vT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkM2I1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9PV05FUlMKQEAgLTAsMCArMSwyIEBACitqdGlua2VyQGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWRybS9tYWluX21lZGlhZHJtc2VydmVyLmNwcAppbmRleCBiNjg1YWUwLi5iNzY3YjhjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9tYWluX21lZGlhZHJtc2VydmVyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9tYWluX21lZGlhZHJtc2VydmVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSAiTWVkaWFEcm1TZXJ2aWNlLmgiCi0jaW5jbHVkZSAiTWVkaWFDYXNTZXJ2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC0zOSw3ICszOCw2IEBACiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIEFMT0dJKCJTZXJ2aWNlTWFuYWdlcjogJXAiLCBzbS5nZXQoKSk7CiAgICAgTWVkaWFEcm1TZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwotICAgIE1lZGlhQ2FzU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE2Y2NlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAoramVmZnZAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWxvZy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4YjhlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2VsYXVyZW50QGdvb2dsZS5jb20KK2drYXN0ZW5AYW5kcm9pZC5jb20KK2h1bmdhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmFiZjhmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvT1dORVJTCkBAIC0wLDAgKzEgQEAKK2R3a2FuZ0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9PV05FUlMgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNTFmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL09XTkVSUwpAQCAtMCwwICsxIEBACitwaGlsYnVya0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKaW5kZXggZmM0NTMyYy4uYzMxNTU3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcApAQCAtMTYsMTIgKzE2LDExIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU2VydmljZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSAiU2hhcmVkTWVtb3J5UHJveHkuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBTaGFyZWRNZW1vcnlQcm94eTo6flNoYXJlZE1lbW9yeVByb3h5KCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjUwZGMzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgUmFkaW9TZXJ2aWNlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJhdWRpb2NsaWVudCBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYnJhZGlvIFwKLSAgICBsaWJyYWRpb19tZXRhZGF0YQotCi1pZmVxICgkKFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMKSx0cnVlKQotIyBsaWJoYXJkd2FyZSBjb25maWd1cmF0aW9uCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICBcCi0gICAgUmFkaW9IYWxMZWdhY3kuY3BwCi1lbHNlCi0jIFRyZWJsZSBjb25maWd1cmF0aW9uCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgSGlkbFV0aWxzLmNwcCBcCi0gICAgUmFkaW9IYWxIaWRsLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJod2JpbmRlciBcCi0gICAgbGliaGlkbGJhc2UgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGxpYmJhc2UgXAotICAgIGxpYmF1ZGlvaGFsIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDEuMAotZW5kaWYKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJyYWRpb3NlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmNwcCBiL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OTUzNzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNkZWZpbmUgTE9HX1RBRyAiSGlkbFV0aWxzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpb19tZXRhZGF0YS5oPgotCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpNZXRhZGF0YVR5cGU7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkJhbmQ7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkRlZW1waGFzaXM7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlJkczsKLQotLy9zdGF0aWMKLWludCBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoUmVzdWx0IHJlc3VsdCkKLXsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOgotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOgotICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpUSU1FT1VUOgotICAgICAgICAgICAgcmV0dXJuIC1FVElNRURPVVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci19Ci0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ1RvSGFsKEJhbmRDb25maWcgKmhhbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgaGFsQ29uZmlnLT50eXBlID0gc3RhdGljX2Nhc3Q8QmFuZD4oY29uZmlnLT50eXBlKTsKLSAgICBoYWxDb25maWctPmFudGVubmFDb25uZWN0ZWQgPSBjb25maWctPmFudGVubmFfY29ubmVjdGVkOwotICAgIGhhbENvbmZpZy0+bG93ZXJMaW1pdCA9IGNvbmZpZy0+bG93ZXJfbGltaXQ7Ci0gICAgaGFsQ29uZmlnLT51cHBlckxpbWl0ID0gY29uZmlnLT51cHBlcl9saW1pdDsKLSAgICBoYWxDb25maWctPnNwYWNpbmdzLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1bnNpZ25lZCBpbnQgKj4oJmNvbmZpZy0+c3BhY2luZ3NbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5udW1fc3BhY2luZ3MgKiBzaXplb2YodWludDMyX3QpKTsKLSAgICAvLyBGSVhNRTogdHJhbnNmZXIgYnVmZmVyIG93bmVyc2hpcC4gc2hvdWxkIGhhdmUgYSBtZXRob2QgZm9yIHRoYXQgaW4gaGlkbF92ZWMKLSAgICBoYWxDb25maWctPnNwYWNpbmdzLnJlc2l6ZShjb25maWctPm51bV9zcGFjaW5ncyk7Ci0KLSAgICBpZiAoaGFsQ29uZmlnLT50eXBlID09IEJhbmQ6OkZNKSB7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLmRlZW1waGFzaXMgPSBzdGF0aWNfY2FzdDxEZWVtcGhhc2lzPihjb25maWctPmZtLmRlZW1waGFzaXMpOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5zdGVyZW8gPSBjb25maWctPmZtLnN0ZXJlbzsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0ucmRzID0gc3RhdGljX2Nhc3Q8UmRzPihjb25maWctPmZtLnJkcyk7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLnRhID0gY29uZmlnLT5mbS50YTsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0uYWYgPSBjb25maWctPmZtLmFmOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5lYSA9IGNvbmZpZy0+Zm0uZWE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuYW0uc3RlcmVvID0gY29uZmlnLT5hbS5zdGVyZW87Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRQcm9wZXJ0aWVzRnJvbUhhbChyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0aWVzICpoYWxQcm9wZXJ0aWVzKQotewotICAgIHByb3BlcnRpZXMtPmNsYXNzX2lkID0gc3RhdGljX2Nhc3Q8cmFkaW9fY2xhc3NfdD4oaGFsUHJvcGVydGllcy0+Y2xhc3NJZCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5pbXBsZW1lbnRvciwgaGFsUHJvcGVydGllcy0+aW1wbGVtZW50b3IuY19zdHIoKSwgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+cHJvZHVjdCwgaGFsUHJvcGVydGllcy0+cHJvZHVjdC5jX3N0cigpLCBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT52ZXJzaW9uLCBoYWxQcm9wZXJ0aWVzLT52ZXJzaW9uLmNfc3RyKCksIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnNlcmlhbCwgaGFsUHJvcGVydGllcy0+c2VyaWFsLmNfc3RyKCksIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBwcm9wZXJ0aWVzLT5udW1fdHVuZXJzID0gaGFsUHJvcGVydGllcy0+bnVtVHVuZXJzOwotICAgIHByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzID0gaGFsUHJvcGVydGllcy0+bnVtQXVkaW9Tb3VyY2VzOwotICAgIHByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmUgPSBoYWxQcm9wZXJ0aWVzLT5zdXBwb3J0c0NhcHR1cmU7Ci0gICAgcHJvcGVydGllcy0+bnVtX2JhbmRzID0gaGFsUHJvcGVydGllcy0+YmFuZHMuc2l6ZSgpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxQcm9wZXJ0aWVzLT5iYW5kcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwoJnByb3BlcnRpZXMtPmJhbmRzW2ldLCAmaGFsUHJvcGVydGllcy0+YmFuZHNbaV0pOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFuZENvbmZpZyAqaGFsQ29uZmlnKQotewotICAgIGNvbmZpZy0+dHlwZSA9IHN0YXRpY19jYXN0PHJhZGlvX2JhbmRfdD4oaGFsQ29uZmlnLT50eXBlKTsKLSAgICBjb25maWctPmFudGVubmFfY29ubmVjdGVkID0gaGFsQ29uZmlnLT5hbnRlbm5hQ29ubmVjdGVkOwotICAgIGNvbmZpZy0+bG93ZXJfbGltaXQgPSBoYWxDb25maWctPmxvd2VyTGltaXQ7Ci0gICAgY29uZmlnLT51cHBlcl9saW1pdCA9IGhhbENvbmZpZy0+dXBwZXJMaW1pdDsKLSAgICBjb25maWctPm51bV9zcGFjaW5ncyA9IGhhbENvbmZpZy0+c3BhY2luZ3Muc2l6ZSgpOwotICAgIGlmIChjb25maWctPm51bV9zcGFjaW5ncyA+IFJBRElPX05VTV9TUEFDSU5HU19NQVgpIHsKLSAgICAgICAgY29uZmlnLT5udW1fc3BhY2luZ3MgPSBSQURJT19OVU1fU1BBQ0lOR1NfTUFYOwotICAgIH0KLSAgICBtZW1jcHkoY29uZmlnLT5zcGFjaW5ncywgaGFsQ29uZmlnLT5zcGFjaW5ncy5kYXRhKCksCi0gICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKiBjb25maWctPm51bV9zcGFjaW5ncyk7Ci0KLSAgICBpZiAoaGFsQ29uZmlnLT50eXBlID09IEJhbmQ6OkZNKSB7Ci0gICAgICAgIGNvbmZpZy0+Zm0uZGVlbXBoYXNpcyA9IHN0YXRpY19jYXN0PHJhZGlvX2RlZW1waGFzaXNfdD4oaGFsQ29uZmlnLT5leHQuZm0uZGVlbXBoYXNpcyk7Ci0gICAgICAgIGNvbmZpZy0+Zm0uc3RlcmVvID0gaGFsQ29uZmlnLT5leHQuZm0uc3RlcmVvOwotICAgICAgICBjb25maWctPmZtLnJkcyA9IHN0YXRpY19jYXN0PHJhZGlvX3Jkc190PihoYWxDb25maWctPmV4dC5mbS5yZHMpOwotICAgICAgICBjb25maWctPmZtLnRhID0gaGFsQ29uZmlnLT5leHQuZm0udGE7Ci0gICAgICAgIGNvbmZpZy0+Zm0uYWYgPSBoYWxDb25maWctPmV4dC5mbS5hZjsKLSAgICAgICAgY29uZmlnLT5mbS5lYSA9IGhhbENvbmZpZy0+ZXh0LmZtLmVhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbmZpZy0+YW0uc3RlcmVvID0gaGFsQ29uZmlnLT5leHQuYW0uc3RlcmVvOwotICAgIH0KLX0KLQotCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtSW5mbyAqaGFsSW5mbykKLXsKLSAgICBpbmZvLT5jaGFubmVsID0gaGFsSW5mby0+Y2hhbm5lbDsKLSAgICBpbmZvLT5zdWJfY2hhbm5lbCA9IGhhbEluZm8tPnN1YkNoYW5uZWw7Ci0gICAgaW5mby0+dHVuZWQgPSBoYWxJbmZvLT50dW5lZDsKLSAgICBpbmZvLT5zdGVyZW8gPSBoYWxJbmZvLT5zdGVyZW87Ci0gICAgaW5mby0+ZGlnaXRhbCA9IGhhbEluZm8tPmRpZ2l0YWw7Ci0gICAgaW5mby0+c2lnbmFsX3N0cmVuZ3RoID0gaGFsSW5mby0+c2lnbmFsU3RyZW5ndGg7Ci0gICAgY29udmVydE1ldGFEYXRhRnJvbUhhbCgmaW5mby0+bWV0YWRhdGEsIGhhbEluZm8tPm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5mby0+Y2hhbm5lbCwgaGFsSW5mby0+c3ViQ2hhbm5lbCk7Ci19Ci0KLS8vIFRPRE8odHdhc2lsY3p5ayk6IGRyb3AgdW5uZWNlc3NhcnkgY2hhbm5lbCBpbmZvCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRNZXRhRGF0YUZyb21IYWwocmFkaW9fbWV0YWRhdGFfdCAqKm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8TWV0YURhdGE+JiBoYWxNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWwgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJDaGFubmVsIF9fdW51c2VkKQotewotCi0gICAgaWYgKG1ldGFkYXRhID09IG51bGxwdHIgfHwgKm1ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoImRlc3RpbmF0aW9uIG1ldGFkYXRhIGJ1ZmZlciBpcyBhIG51bGxwdHIiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbE1ldGFkYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJhZGlvX21ldGFkYXRhX2tleV90IGtleSA9IHN0YXRpY19jYXN0PHJhZGlvX21ldGFkYXRhX2tleV90PihoYWxNZXRhZGF0YVtpXS5rZXkpOwotICAgICAgICByYWRpb19tZXRhZGF0YV90eXBlX3QgdHlwZSA9IHN0YXRpY19jYXN0PHJhZGlvX21ldGFkYXRhX2tleV90PihoYWxNZXRhZGF0YVtpXS50eXBlKTsKLSAgICAgICAgcmFkaW9fbWV0YWRhdGFfY2xvY2tfdCBjbG9jazsKLQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBSQURJT19NRVRBREFUQV9UWVBFX0lOVDoKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9pbnQobWV0YWRhdGEsIGtleSwgaGFsTWV0YWRhdGFbaV0uaW50VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9URVhUOgotICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfYWRkX3RleHQobWV0YWRhdGEsIGtleSwgaGFsTWV0YWRhdGFbaV0uc3RyaW5nVmFsdWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSQURJT19NRVRBREFUQV9UWVBFX1JBVzoKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9yYXcobWV0YWRhdGEsIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0ucmF3VmFsdWUuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxNZXRhZGF0YVtpXS5yYXdWYWx1ZS5zaXplKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9DTE9DSzoKLSAgICAgICAgICAgIGNsb2NrLnV0Y19zZWNvbmRzX3NpbmNlX2Vwb2NoID0KLSAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0uY2xvY2tWYWx1ZS51dGNTZWNvbmRzU2luY2VFcG9jaDsKLSAgICAgICAgICAgIGNsb2NrLnRpbWV6b25lX29mZnNldF9pbl9taW51dGVzID0KLSAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0uY2xvY2tWYWx1ZS50aW1lem9uZU9mZnNldEluTWludXRlczsKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9jbG9jayhtZXRhZGF0YSwga2V5LCAmY2xvY2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBtZXRhZGF0YSB0eXBlICV1IixfX0ZVTkNUSU9OX18sIGhhbE1ldGFkYXRhW2ldLnR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuaCBiL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzcxMDYwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfVVRJTFNfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX1VUSUxTX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlJlc3VsdDsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvcGVydGllczsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6QmFuZENvbmZpZzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvZ3JhbUluZm87Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6Ok1ldGFEYXRhOwotCi1jbGFzcyBIaWRsVXRpbHMgewotcHVibGljOgotICAgIHN0YXRpYyBpbnQgY29udmVydEhhbFJlc3VsdChSZXN1bHQgcmVzdWx0KTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFuZENvbmZpZyAqaGFsQ29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0UHJvcGVydGllc0Zyb21IYWwocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvcGVydGllcyAqaGFsUHJvcGVydGllcyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydEJhbmRDb25maWdUb0hhbChCYW5kQ29uZmlnICpoYWxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbUluZm8gKmhhbEluZm8pOwotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YUZyb21IYWwocmFkaW9fbWV0YWRhdGFfdCAqKm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8TWV0YURhdGE+JiBoYWxNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJDaGFubmVsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9VVElMU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuY3BwIGIvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzNzI3NS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPHN5c3RlbS9SYWRpb01ldGFkYXRhV3JhcHBlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lCcm9hZGNhc3RSYWRpb0ZhY3RvcnkuaD4KLQotI2luY2x1ZGUgIlJhZGlvSGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6SUJyb2FkY2FzdFJhZGlvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6Q2xhc3M7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkRpcmVjdGlvbjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvcGVydGllczsKLQotCi0vKiBzdGF0aWMgKi8KLXNwPFJhZGlvSW50ZXJmYWNlPiBSYWRpb0ludGVyZmFjZTo6Y29ubmVjdE1vZHVsZShyYWRpb19jbGFzc190IGNsYXNzSWQpCi17Ci0gICAgcmV0dXJuIG5ldyBSYWRpb0hhbEhpZGwoY2xhc3NJZCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OmdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHNwPElCcm9hZGNhc3RSYWRpbz4gbW9kdWxlID0gZ2V0U2VydmljZSgpOwotICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUHJvcGVydGllcyBoYWxQcm9wZXJ0aWVzOwotICAgIFJlc3VsdCBoYWxSZXN1bHQgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9Ci0gICAgICAgICAgICBtb2R1bGUtPmdldFByb3BlcnRpZXMoWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IFByb3BlcnRpZXMmIHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICBpZiAoaGFsUmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgSGlkbFV0aWxzOjpjb252ZXJ0UHJvcGVydGllc0Zyb21IYWwocHJvcGVydGllcywgJmhhbFByb3BlcnRpZXMpOwotICAgIH0KLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhhbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6Om9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IG1vZHVsZSA9IGdldFNlcnZpY2UoKTsKLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHNwPFR1bmVyPiB0dW5lckltcGwgPSBuZXcgVHVuZXIoY2FsbGJhY2ssIHRoaXMpOwotCi0gICAgQmFuZENvbmZpZyBoYWxDb25maWc7Ci0gICAgUmVzdWx0IGhhbFJlc3VsdCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIHNwPElUdW5lcj4gaGFsVHVuZXI7Ci0KLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRCYW5kQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9Ci0gICAgICAgICAgICBtb2R1bGUtPm9wZW5UdW5lcihoYWxDb25maWcsIGF1ZGlvLCB0dW5lckltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHJlc3VsdCwgY29uc3Qgc3A8SVR1bmVyPiYgdHVuZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbFR1bmVyID0gdHVuZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgIGlmIChoYWxSZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICB0dW5lckltcGwtPnNldEhhbFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgdHVuZXIgPSB0dW5lckltcGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoYWxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpjbG9zZVR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgc3A8VHVuZXI+IHR1bmVySW1wbCA9IHN0YXRpY19jYXN0PFR1bmVyICo+KHR1bmVyLmdldCgpKTsKLSAgICBzcDxJVHVuZXI+IGNsZWFyVHVuZXI7Ci0gICAgdHVuZXJJbXBsLT5zZXRIYWxUdW5lcihjbGVhclR1bmVyKTsKLSAgICByZXR1cm4gMDsKLX0KLQotUmFkaW9IYWxIaWRsOjpSYWRpb0hhbEhpZGwocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotICAgIDogbUNsYXNzSWQoY2xhc3NJZCkKLXsKLX0KLQotUmFkaW9IYWxIaWRsOjp+UmFkaW9IYWxIaWRsKCkKLXsKLX0KLQotc3A8SUJyb2FkY2FzdFJhZGlvPiBSYWRpb0hhbEhpZGw6OmdldFNlcnZpY2UoKQotewotICAgIGlmIChtSGFsTW9kdWxlID09IDApIHsKLSAgICAgICAgc3A8SUJyb2FkY2FzdFJhZGlvRmFjdG9yeT4gZmFjdG9yeSA9IElCcm9hZGNhc3RSYWRpb0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKGZhY3RvcnkgIT0gMCkgewotICAgICAgICAgICAgZmFjdG9yeS0+Y29ubmVjdE1vZHVsZShzdGF0aWNfY2FzdDxDbGFzcz4obUNsYXNzSWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgcmV0dmFsLCBjb25zdCA6OmFuZHJvaWQ6OnNwPElCcm9hZGNhc3RSYWRpbz4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtSGFsTW9kdWxlID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCIlcyBPVVQgbW9kdWxlICVwIiwgX19GVU5DVElPTl9fLCBtSGFsTW9kdWxlLmdldCgpKTsKLSAgICByZXR1cm4gbUhhbE1vZHVsZTsKLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OmNsZWFyU2VydmljZSgpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1vZHVsZSAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbE1vZHVsZS5nZXQoKSk7Ci0gICAgbUhhbE1vZHVsZS5jbGVhcigpOwotfQotCi0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLQotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgQmFuZENvbmZpZyBoYWxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7Ci0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0gbUhhbFR1bmVyLT5zZXRDb25maWd1cmF0aW9uKGhhbENvbmZpZyk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgQmFuZENvbmZpZyBoYWxDb25maWc7Ci0gICAgUmVzdWx0IGhhbFJlc3VsdDsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9Ci0gICAgICAgICAgICBtSGFsVHVuZXItPmdldENvbmZpZ3VyYXRpb24oWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IEJhbmRDb25maWcmIGNvbmZpZykgewotICAgICAgICAgICAgICAgICAgICBoYWxSZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ29uZmlnID0gY29uZmlnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgaWYgKGhpZGxSZXR1cm4uaXNPaygpICYmIGhhbFJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdGcm9tSGFsKGNvbmZpZywgJmhhbENvbmZpZyk7Ci0gICAgfQotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGFsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPQotICAgICAgICAgICAgbUhhbFR1bmVyLT5zY2FuKHN0YXRpY19jYXN0PERpcmVjdGlvbj4oZGlyZWN0aW9uKSwgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPQotICAgICAgICAgICAgbUhhbFR1bmVyLT5zdGVwKHN0YXRpY19jYXN0PERpcmVjdGlvbj4oZGlyZWN0aW9uKSwgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCkKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUmV0dXJuPFJlc3VsdD4gaGlkbFJlc3VsdCA9Ci0gICAgICAgICAgICBtSGFsVHVuZXItPnR1bmUoY2hhbm5lbCwgc3ViX2NoYW5uZWwpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpjYW5jZWwoKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0gbUhhbFR1bmVyLT5jYW5jZWwoKTsKLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhpZGxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBpZiAoaW5mbyA9PSBudWxscHRyIHx8IGluZm8tPm1ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgUHJvZ3JhbUluZm8gaGFsSW5mbzsKLSAgICBSZXN1bHQgaGFsUmVzdWx0OwotICAgIFJldHVybjx2b2lkPiBoaWRsUmV0dXJuID0gbUhhbFR1bmVyLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oCi0gICAgICAgIFsmXShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9ncmFtSW5mbyYgaW5mbykgewotICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgaGFsSW5mbyA9IGluZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIGlmIChoaWRsUmV0dXJuLmlzT2soKSAmJiBoYWxSZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwoaW5mbywgJmhhbEluZm8pOwotICAgIH0KLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhhbFJlc3VsdCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjpoYXJkd2FyZUZhaWx1cmUoKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgaGFuZGxlSHdGYWlsdXJlKCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6Y29uZmlnQ2hhbmdlKFJlc3VsdCByZXN1bHQsIGNvbnN0IEJhbmRDb25maWcmIGNvbmZpZykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OwotICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihyYWRpb19oYWxfZXZlbnRfdCkpOwotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9DT05GSUc7Ci0gICAgZXZlbnQuc3RhdHVzID0gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KHJlc3VsdCk7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwoJmV2ZW50LmNvbmZpZywgJmNvbmZpZyk7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnR1bmVDb21wbGV0ZShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9ncmFtSW5mbyYgaW5mbykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50ID0ge307Ci0gICAgUmFkaW9NZXRhZGF0YVdyYXBwZXIgbWV0YWRhdGFXcmFwcGVyKCZldmVudC5pbmZvLm1ldGFkYXRhKTsKLQotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9UVU5FRDsKLSAgICBldmVudC5zdGF0dXMgPSBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQocmVzdWx0KTsKLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwoJmV2ZW50LmluZm8sICZpbmZvKTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6YWZTd2l0Y2goY29uc3QgUHJvZ3JhbUluZm8mIGluZm8pCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudCA9IHt9OwotICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmZXZlbnQuaW5mby5tZXRhZGF0YSk7Ci0KLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQUZfU1dJVENIOwotICAgIEhpZGxVdGlsczo6Y29udmVydFByb2dyYW1JbmZvRnJvbUhhbCgmZXZlbnQuaW5mbywgJmluZm8pOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjphbnRlbm5hU3RhdGVDaGFuZ2UoYm9vbCBjb25uZWN0ZWQpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQU5URU5OQTsKLSAgICBldmVudC5vbiA9IGNvbm5lY3RlZDsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnRyYWZmaWNBbm5vdW5jZW1lbnQoYm9vbCBhY3RpdmUpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfVEE7Ci0gICAgZXZlbnQub24gPSBhY3RpdmU7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjplbWVyZ2VuY3lBbm5vdW5jZW1lbnQoYm9vbCBhY3RpdmUpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfRUE7Ci0gICAgZXZlbnQub24gPSBhY3RpdmU7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjpuZXdNZXRhZGF0YSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8TWV0YURhdGE+JiBtZXRhZGF0YSkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50ID0ge307Ci0gICAgUmFkaW9NZXRhZGF0YVdyYXBwZXIgbWV0YWRhdGFXcmFwcGVyKCZldmVudC5tZXRhZGF0YSk7Ci0KLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfTUVUQURBVEE7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0TWV0YURhdGFGcm9tSGFsKCZldmVudC5tZXRhZGF0YSwgbWV0YWRhdGEsIGNoYW5uZWwsIHN1YkNoYW5uZWwpOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLQotUmFkaW9IYWxIaWRsOjpUdW5lcjo6VHVuZXIoc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssIHNwPFJhZGlvSGFsSGlkbD4gbW9kdWxlKQotICAgIDogVHVuZXJJbnRlcmZhY2UoKSwgbUhhbFR1bmVyKE5VTEwpLCBtQ2FsbGJhY2soY2FsbGJhY2spLCBtUGFyZW50TW9kdWxlKG1vZHVsZSkKLXsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIGhhbmRsZXIgd2UgYXJlIHBhc3NpbmcgaW4gb25seSBkZWFscyB3aXRoIGNvbnN0IG1lbWJlcnMsCi0gICAgLy8gYXMgaXQgY2FuIGJlIGNhbGxlZCBvbiBhbiBhcmJpdHJhcnkgdGhyZWFkLgotICAgIGNvbnN0IGF1dG8mIHNlbGYgPSB0aGlzOwotICAgIEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+cmVnaXN0ZXJBdEV4aXRIYW5kbGVyKAotICAgICAgICAgICAgdGhpcywgWyZzZWxmXSgpIHsgc2VsZi0+c2VuZEh3RmFpbHVyZUV2ZW50KCk7IH0pOwotfQotCi0KLVJhZGlvSGFsSGlkbDo6VHVuZXI6On5UdW5lcigpCi17Ci0gICAgSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLT51bnJlZ2lzdGVyQXRFeGl0SGFuZGxlcih0aGlzKTsKLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzZXRIYWxUdW5lcihzcDxJVHVuZXI+JiBoYWxUdW5lcikgewotICAgIGlmIChtSGFsVHVuZXIgIT0gMCkgewotICAgICAgICBtSGFsVHVuZXItPnVubGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpKTsKLSAgICB9Ci0gICAgbUhhbFR1bmVyID0gaGFsVHVuZXI7Ci0gICAgaWYgKG1IYWxUdW5lciAhPSAwKSB7Ci0gICAgICAgIG1IYWxUdW5lci0+bGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLCAwIC8qY29va2llKi8pOwotICAgIH0KLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpoYW5kbGVId0ZhaWx1cmUoKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3A8UmFkaW9IYWxIaWRsPiBwYXJlbnRNb2R1bGUgPSBtUGFyZW50TW9kdWxlLnByb21vdGUoKTsKLSAgICBpZiAocGFyZW50TW9kdWxlICE9IDApIHsKLSAgICAgICAgcGFyZW50TW9kdWxlLT5jbGVhclNlcnZpY2UoKTsKLSAgICB9Ci0gICAgc2VuZEh3RmFpbHVyZUV2ZW50KCk7Ci0gICAgbUhhbFR1bmVyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6c2VuZEh3RmFpbHVyZUV2ZW50KCkgY29uc3QKLXsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfSFdfRkFJTFVSRTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6b25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIG1DYWxsYmFjay0+b25FdmVudChoYWxFdmVudCk7Ci0gICAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTg0MjBkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiUmFkaW9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lCcm9hZGNhc3RSYWRpby5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lUdW5lci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lUdW5lckNhbGxiYWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UmVzdWx0OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpJQnJvYWRjYXN0UmFkaW87Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OklUdW5lcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6SVR1bmVyQ2FsbGJhY2s7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6QmFuZENvbmZpZzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvZ3JhbUluZm87Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6Ok1ldGFEYXRhOwotCi1jbGFzcyBSYWRpb0hhbEhpZGwgOiBwdWJsaWMgUmFkaW9JbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgUmFkaW9IYWxIaWRsKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmFkaW9JbnRlcmZhY2UKLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKTsKLSAgICAgICAgdmlydHVhbCBpbnQgb3BlblR1bmVyKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKTsKLSAgICAgICAgdmlydHVhbCBpbnQgY2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKTsKLQotICAgICAgICBjbGFzcyBUdW5lciAgOiBwdWJsaWMgVHVuZXJJbnRlcmZhY2UsIHB1YmxpYyB2aXJ0dWFsIElUdW5lckNhbGxiYWNrCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgVHVuZXIoc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssIHNwPFJhZGlvSGFsSGlkbD4gbW9kdWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVuZXJJbnRlcmZhY2UKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHNldENvbmZpZ3VyYXRpb24oY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBjYW5jZWwoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElUdW5lckNhbGxiYWNrCi0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBoYXJkd2FyZUZhaWx1cmUoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbmZpZ0NoYW5nZShSZXN1bHQgcmVzdWx0LCBjb25zdCBCYW5kQ29uZmlnJiBjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gdHVuZUNvbXBsZXRlKFJlc3VsdCByZXN1bHQsIGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGFmU3dpdGNoKGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGFudGVubmFTdGF0ZUNoYW5nZShib29sIGNvbm5lY3RlZCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiB0cmFmZmljQW5ub3VuY2VtZW50KGJvb2wgYWN0aXZlKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGVtZXJnZW5jeUFubm91bmNlbWVudChib29sIGFjdGl2ZSk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBuZXdNZXRhZGF0YSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzxNZXRhRGF0YT4mIG1ldGFkYXRhKTsKLQotICAgICAgICAgICAgdm9pZCBzZXRIYWxUdW5lcihzcDxJVHVuZXI+JiBoYWxUdW5lcik7Ci0gICAgICAgICAgICBzcDxJVHVuZXI+IGdldEhhbFR1bmVyKCkgeyByZXR1cm4gbUhhbFR1bmVyOyB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHZpcnR1YWwgICAgICAgICAgflR1bmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgb25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpIGNvbnN0OwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICBoYW5kbGVId0ZhaWx1cmUoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgc2VuZEh3RmFpbHVyZUV2ZW50KCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIHNwPElUdW5lcj4gbUhhbFR1bmVyOwotICAgICAgICAgICAgY29uc3Qgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gbUNhbGxiYWNrOwotICAgICAgICAgICAgd3A8UmFkaW9IYWxIaWRsPiBtUGFyZW50TW9kdWxlOwotICAgICAgICB9OwotCi0gICAgICAgIHNwPElCcm9hZGNhc3RSYWRpbz4gZ2V0U2VydmljZSgpOwotICAgICAgICB2b2lkIGNsZWFyU2VydmljZSgpOwotCi1wcml2YXRlOgotICAgICAgICB2aXJ0dWFsICAgICAgICAgflJhZGlvSGFsSGlkbCgpOwotCi0gICAgICAgICAgICAgICAgcmFkaW9fY2xhc3NfdCBtQ2xhc3NJZDsKLSAgICAgICAgICAgICAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IG1IYWxNb2R1bGU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwY2NkNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9IYWxMZWdhY3kiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0jaW5jbHVkZSAiUmFkaW9IYWxMZWdhY3kuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jb25zdCBjaGFyICpSYWRpb0hhbExlZ2FjeTo6c0NsYXNzTW9kdWxlTmFtZXNbXSA9IHsKLSAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSURfRk0sIC8qIGNvcnJlc3BvbmRzIHRvIFJBRElPX0NMQVNTX0FNX0ZNICovCi0gICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NBVCwgIC8qIGNvcnJlc3BvbmRzIHRvIFJBRElPX0NMQVNTX1NBVCAqLwotICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRF9EVCwgICAvKiBjb3JyZXNwb25kcyB0byBSQURJT19DTEFTU19EVCAqLwotfTsKLQotLyogc3RhdGljICovCi1zcDxSYWRpb0ludGVyZmFjZT4gUmFkaW9JbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotewotICAgIHJldHVybiBuZXcgUmFkaW9IYWxMZWdhY3koY2xhc3NJZCk7Ci19Ci0KLVJhZGlvSGFsTGVnYWN5OjpSYWRpb0hhbExlZ2FjeShyYWRpb19jbGFzc190IGNsYXNzSWQpCi0gICAgOiBSYWRpb0ludGVyZmFjZSgpLCBtQ2xhc3NJZChjbGFzc0lkKSwgbUh3RGV2aWNlKE5VTEwpCi17Ci19Ci0KLXZvaWQgUmFkaW9IYWxMZWdhY3k6Om9uRmlyc3RSZWYoKQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotICAgIEFMT0dJKCIlcyBtQ2xhc3NJZCAlZCIsIF9fRlVOQ1RJT05fXywgbUNsYXNzSWQpOwotCi0gICAgbUh3RGV2aWNlID0gTlVMTDsKLQotICAgIGlmICgobUNsYXNzSWQgPCAwKSB8fAotICAgICAgICAgICAgKG1DbGFzc0lkID49IE5FTEVNKHNDbGFzc01vZHVsZU5hbWVzKSkpIHsKLSAgICAgICAgQUxPR0UoImludmFsaWQgY2xhc3MgSUQgJWQiLCBtQ2xhc3NJZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HSSgiJXMgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEICVzICVzIiwKLSAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgc0NsYXNzTW9kdWxlTmFtZXNbbUNsYXNzSWRdKTsKLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIHNDbGFzc01vZHVsZU5hbWVzW21DbGFzc0lkXSwgJm1vZCk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IGxvYWQgcmFkaW8gbW9kdWxlICVzLiVzICglcykiLAotICAgICAgICAgICAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIHNDbGFzc01vZHVsZU5hbWVzW21DbGFzc0lkXSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmMgPSByYWRpb19od19kZXZpY2Vfb3Blbihtb2QsICZtSHdEZXZpY2UpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuIHJhZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCAicHJpbWFyeSIsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBtSHdEZXZpY2UgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uICE9IFJBRElPX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7Ci0gICAgICAgIEFMT0dFKCJ3cm9uZyByYWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJhZGlvX2h3X2RldmljZV9jbG9zZShtSHdEZXZpY2UpOwotICAgICAgICBtSHdEZXZpY2UgPSBOVUxMOwotICAgIH0KLX0KLQotUmFkaW9IYWxMZWdhY3k6On5SYWRpb0hhbExlZ2FjeSgpCi17Ci0gICAgaWYgKG1Id0RldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJhZGlvX2h3X2RldmljZV9jbG9zZShtSHdEZXZpY2UpOwotICAgIH0KLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpnZXRQcm9wZXJ0aWVzKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLQotICAgIGludCByYyA9IG1Id0RldmljZS0+Z2V0X3Byb3BlcnRpZXMobUh3RGV2aWNlLCBwcm9wZXJ0aWVzKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGQgbm90IHJlYWQgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcyIpOwotICAgIH0KLQotICAgIHJldHVybiByYzsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBzcDxUdW5lcj4gdHVuZXJJbXBsID0gbmV3IFR1bmVyKGNhbGxiYWNrKTsKLQotICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqaGFsVHVuZXI7Ci0gICAgaW50IHJjID0gbUh3RGV2aWNlLT5vcGVuX3R1bmVyKG1Id0RldmljZSwgY29uZmlnLCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpjYWxsYmFjaywgdHVuZXJJbXBsLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsVHVuZXIpOwotICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIHR1bmVySW1wbC0+c2V0SGFsVHVuZXIoaGFsVHVuZXIpOwotICAgICAgICB0dW5lciA9IHR1bmVySW1wbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OmNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIGlmICh0dW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBzcDxUdW5lcj4gdHVuZXJJbXBsID0gKFR1bmVyICopdHVuZXIuZ2V0KCk7Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+Y2xvc2VfdHVuZXIobUh3RGV2aWNlLCB0dW5lckltcGwtPmdldEhhbFR1bmVyKCkpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5zZXRfY29uZmlndXJhdGlvbihtSGFsVHVuZXIsIGNvbmZpZyk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPmdldF9jb25maWd1cmF0aW9uKG1IYWxUdW5lciwgY29uZmlnKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPnNjYW4obUhhbFR1bmVyLCBkaXJlY3Rpb24sIHNraXBfc3ViX2NoYW5uZWwpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+c3RlcChtSGFsVHVuZXIsIGRpcmVjdGlvbiwgc2tpcF9zdWJfY2hhbm5lbCk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OnR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCkKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPnR1bmUobUhhbFR1bmVyLCBjaGFubmVsLCBzdWJfY2hhbm5lbCk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmNhbmNlbCgpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5jYW5jZWwobUhhbFR1bmVyKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+Z2V0X3Byb2dyYW1faW5mb3JtYXRpb24obUhhbFR1bmVyLCBpbmZvKTsKLX0KLQotdm9pZCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6Om9uQ2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KQotewotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoaGFsRXZlbnQpOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpjYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQsIHZvaWQgKmNvb2tpZSkKLXsKLSAgICB3cDxSYWRpb0hhbExlZ2FjeTo6VHVuZXI+IHdlYWsgPSB3cDxSYWRpb0hhbExlZ2FjeTo6VHVuZXI+KChSYWRpb0hhbExlZ2FjeTo6VHVuZXIgKiljb29raWUpOwotICAgIHNwPFJhZGlvSGFsTGVnYWN5OjpUdW5lcj4gdHVuZXIgPSB3ZWFrLnByb21vdGUoKTsKLSAgICBpZiAodHVuZXIgIT0gMCkgewotICAgICAgICB0dW5lci0+b25DYWxsYmFjayhoYWxFdmVudCk7Ci0gICAgfQotfQotCi1SYWRpb0hhbExlZ2FjeTo6VHVuZXI6OlR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrKQotICAgIDogVHVuZXJJbnRlcmZhY2UoKSwgbUhhbFR1bmVyKE5VTEwpLCBtQ2FsbGJhY2soY2FsbGJhY2spCi17Ci19Ci0KLQotUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjp+VHVuZXIoKQotewotfQotCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDQ4MzFiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9MRUdBQ1lfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9MRUdBQ1lfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+Ci0jaW5jbHVkZSAiUmFkaW9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0hhbExlZ2FjeSA6IHB1YmxpYyBSYWRpb0ludGVyZmFjZQotewotcHVibGljOgotICAgICAgICBSYWRpb0hhbExlZ2FjeShyYWRpb19jbGFzc190IGNsYXNzSWQpOwotCi0gICAgICAgIC8vIFJhZGlvSW50ZXJmYWNlCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcyk7Ci0gICAgICAgIHZpcnR1YWwgaW50IG9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0gICAgICAgIHZpcnR1YWwgaW50IGNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0KLSAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgICAgIGNsYXNzIFR1bmVyICA6IHB1YmxpYyBUdW5lckludGVyZmFjZQotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIFR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrKTsKLQotICAgICAgICAgICAgdmlydHVhbCBpbnQgc2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGNhbmNlbCgpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKTsKLQotICAgICAgICAgICAgc3RhdGljIHZvaWQgY2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50LCB2b2lkICpjb29raWUpOwotICAgICAgICAgICAgICAgICAgIHZvaWQgb25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOwotCi0gICAgICAgICAgICB2b2lkIHNldEhhbFR1bmVyKGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqaGFsVHVuZXIpIHsgbUhhbFR1bmVyID0gaGFsVHVuZXI7IH0KLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqZ2V0SGFsVHVuZXIoKSB7IHJldHVybiBtSGFsVHVuZXI7IH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgdmlydHVhbCAgICAgIH5UdW5lcigpOwotCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgICAgKm1IYWxUdW5lcjsKLSAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+ICBtQ2FsbGJhY2s7Ci0gICAgICAgIH07Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCAgICAgflJhZGlvSGFsTGVnYWN5KCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogc0NsYXNzTW9kdWxlTmFtZXNbXTsKLQotICAgICAgICByYWRpb19jbGFzc190IG1DbGFzc0lkOwotICAgICAgICBzdHJ1Y3QgcmFkaW9faHdfZGV2aWNlICAqbUh3RGV2aWNlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfTEVHQUNZX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2ZiNGQ1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0ludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAgICAgLyogZ2V0IGEgc291bmQgdHJpZ2dlciBIQUwgaW5zdGFuY2UgKi8KLSAgICAgICAgc3RhdGljIHNwPFJhZGlvSW50ZXJmYWNlPiBjb25uZWN0TW9kdWxlKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmV0cmlldmUgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcy4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIHByb3BlcnRpZXM6IHdoZXJlIHRvIHJldHVybiB0aGUgbW9kdWxlIHByb3BlcnRpZXMKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgbm8gZXJyb3IKLSAgICAgICAgICogIC1FSU5WQUwgaWYgaW52YWxpZCBhcmd1bWVudHMgYXJlIHBhc3NlZAotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogT3BlbiBhIHR1bmVyIGludGVyZmFjZSBmb3IgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLgotICAgICAgICAgKiBJZiBubyBvdGhlciB0dW5lciBpcyBvcGVuZWQsIHRoaXMgd2lsbCBhY3RpdmF0ZSB0aGUgcmFkaW8gbW9kdWxlLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gY29uZmlnOiB0aGUgYmFuZCBjb25maWd1cmF0aW9uIHRvIGFwcGx5Ci0gICAgICAgICAqIC0gYXVkaW86IHRoaXMgdHVuZXIgd2lsbCBiZSB1c2VkIGZvciBsaXZlIHJhZGlvIGxpc3RlbmluZyBhbmQgc2hvdWxkIGJlIGNvbm5lY3RlZCB0bwotICAgICAgICAgKiB0aGUgcmFkaW8gYXVkaW8gc291cmNlLgotICAgICAgICAgKiAtIGNhbGxiYWNrOiB0aGUgZXZlbnQgY2FsbGJhY2sKLSAgICAgICAgICogLSBjb29raWU6IHRoZSBjb29raWUgdG8gcGFzcyB3aGVuIGNhbGxpbmcgdGhlIGNhbGxiYWNrCi0gICAgICAgICAqIC0gdHVuZXI6IHdoZXJlIHRvIHJldHVybiB0aGUgdHVuZXIgaW50ZXJmYWNlCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIEhXIHdhcyBwb3dlcmVkIHVwIGFuZCBjb25maWd1cmF0aW9uIGNvdWxkIGJlIGFwcGxpZWQKLSAgICAgICAgICogIC1FSU5WQUwgaWYgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWQgaXMgaW52YWxpZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqCi0gICAgICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXZlbnQgUkFESU9fRVZFTlRfQ09ORklHIE1VU1QgYmUgY2FsbGVkIG9uY2UgdGhlCi0gICAgICAgICAqIGNvbmZpZ3VyYXRpb24gaXMgYXBwbGllZCBvciBhIGZhaWx1cmUgb2NjdXJzIG9yIGFmdGVyIGEgdGltZSBvdXQuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDbG9zZSBhIHR1bmVyIGludGVyZmFjZS4KLSAgICAgICAgICogSWYgdGhlIGxhc3QgdHVuZXIgaXMgY2xvc2VkLCB0aGUgcmFkaW8gbW9kdWxlIGlzIGRlYWN0aXZhdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gdHVuZXI6IHRoZSB0dW5lciBpbnRlcmZhY2UgdG8gY2xvc2UKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgcG93ZXJlZCBkb3duIHN1Y2Nlc3NmdWxseS4KLSAgICAgICAgICogIC1FSU5WQUwgaWYgYW4gaW52YWxpZCBhcmd1bWVudCBpcyBwYXNzZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgY2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgUmFkaW9JbnRlcmZhY2UoKSB7fQotICAgICAgICB2aXJ0dWFsICAgICB+UmFkaW9JbnRlcmZhY2UoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwZWU4My4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSAotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUxICAgIDg3NTAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSAgICAxMDgwMDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTEgIDEwMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMiAgICA4NzkwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIgICAgMTA3OTAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyICAyMDAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX0pBUEFOICAgIDc2MDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSkFQQU4gICAgOTAwMDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0pBUEFOICAxMDAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX09JUlQgICAgNjU4MDAKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9PSVJUICAgIDc0MDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9PSVJUICAxMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTFcgICAgICAgICAxNTMKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9MVyAgICAgICAgIDI3OQotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfTFcgICAgICAgOQotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMSAgICA1MzEKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9NV19JVFUxICAgIDE2MTEKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTEgIDkKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX01XX0lVVDIgICAgNTQwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMiAgICAxNjEwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUyICAxMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfU1cgICAgICAgICAyMzAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfU1cgICAgICAgICAyNjEwMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfU1cgICAgICAgNQotCi0KLSNpZm5kZWYgQVJSQVlfU0laRQotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLSNlbmRpZgotCi1jb25zdCByYWRpb19iYW5kX2NvbmZpZ190IHNLbm93blJlZ2lvbkNvbmZpZ3NbXSA9IHsKLSAgICB7ICAgLy8gRk0gSVRVIDEKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTF9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIEFtZXJpY2FzCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKLSAgICAgICAgewotICAgICAgICBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19VUywKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBGTSBKYXBhbgotICAgICAgICBSQURJT19SRUdJT05fSkFQQU4sCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9KQVBBTiwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSkFQQU4sCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9KQVBBTn0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gS29yZWEKLSAgICAgICAgUkFESU9fUkVHSU9OX0tPUkVBLAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTF9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzc1LAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIE9JUlQKLSAgICAgICAgUkFESU9fUkVHSU9OX09JUlQsCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9PSVJULAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9PSVJULAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fT0lSVH0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gVVMgSEQgcmFkaW8KLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0ZNX0hELAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19VUywKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBBTSBMVwotICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfTFcsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0xXLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTFd9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gQU0gU1cKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX1NXLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9TVywKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX1NXfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEFNIE1XIElUVTEKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX01XX0lVVDEsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX01XX0lUVTEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUxfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEFNIE1XIElUVTIKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX01XX0lVVDIsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX01XX0lUVTIsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUyfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX07Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWI3YzA5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvX21ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgotI2luY2x1ZGUgIlJhZGlvU2VydmljZS5oIgotI2luY2x1ZGUgIlJhZGlvUmVnaW9ucy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtSYWRpb1R1bmVyQXVkaW9EZXZpY2VOYW1lW10gPSAiUmFkaW8gdHVuZXIgc291cmNlIjsKLQotc3RhdGljIGNvbnN0IFN0cmluZzE2IFJBRElPX1BFUk1JU1NJT04oImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfRk1fUkFESU8iKTsKLQotUmFkaW9TZXJ2aWNlOjpSYWRpb1NlcnZpY2UoKQotICAgIDogQm5SYWRpb1NlcnZpY2UoKSwgbU5leHRVbmlxdWVJZCgxKQotewotICAgIEFMT0dJKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgc3A8UmFkaW9JbnRlcmZhY2U+IGRldiA9IFJhZGlvSW50ZXJmYWNlOjpjb25uZWN0TW9kdWxlKFJBRElPX0NMQVNTX0FNX0ZNKTsKLQotICAgIGlmIChkZXYgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0cnVjdCByYWRpb19oYWxfcHJvcGVydGllcyBoYWxQcm9wZXJ0aWVzOwotICAgIGludCByYyA9IGRldi0+Z2V0UHJvcGVydGllcygmaGFsUHJvcGVydGllcyk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkIG5vdCByZWFkIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJhZGlvX3Byb3BlcnRpZXNfdCBwcm9wZXJ0aWVzOwotICAgIHByb3BlcnRpZXMuaGFuZGxlID0KLSAgICAgICAgICAgIChyYWRpb19oYW5kbGVfdClhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOwotICAgIGNvbnZlcnRQcm9wZXJ0aWVzKCZwcm9wZXJ0aWVzLCAmaGFsUHJvcGVydGllcyk7Ci0KLSAgICBBTE9HSSgibG9hZGVkIGRlZmF1bHQgbW9kdWxlICVzLCB2ZXIgJXMsIGhhbmRsZSAlZCIsIHByb3BlcnRpZXMucHJvZHVjdCwKLSAgICAgICAgcHJvcGVydGllcy52ZXJzaW9uLCBwcm9wZXJ0aWVzLmhhbmRsZSk7Ci0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG5ldyBNb2R1bGUoZGV2LCBwcm9wZXJ0aWVzKTsKLSAgICBtTW9kdWxlcy5hZGQocHJvcGVydGllcy5oYW5kbGUsIG1vZHVsZSk7Ci19Ci0KLVJhZGlvU2VydmljZTo6flJhZGlvU2VydmljZSgpCi17Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6bGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQUxPR1YoImxpc3RNb2R1bGVzIik7Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOwotICAgIGlmIChudW1Nb2R1bGVzID09IE5VTEwgfHwgKCpudW1Nb2R1bGVzICE9IDAgJiYgcHJvcGVydGllcyA9PSBOVUxMKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICB1aW50MzJfdCBtYXhNb2R1bGVzID0gKm51bU1vZHVsZXM7Ci0gICAgKm51bU1vZHVsZXMgPSBtTW9kdWxlcy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCkgJiYgaSA8IG1heE1vZHVsZXM7IGkrKykgewotICAgICAgICBwcm9wZXJ0aWVzW2ldID0gbU1vZHVsZXMudmFsdWVBdChpKS0+cHJvcGVydGllcygpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6YXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEFMT0dWKCIlcyAlZCBjb25maWcgJXAgd2l0aEF1ZGlvICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUsIGNvbmZpZywgd2l0aEF1ZGlvKTsKLQotICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgcmFkaW8uY2xlYXIoKTsKLSAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3NpemVfdCBpbmRleCA9IG1Nb2R1bGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgY29uZmlnID0gbW9kdWxlLT5nZXREZWZhdWx0Q29uZmlnKCk7Ci0gICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCIlcyByZWdpb24gJWQgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgY29uZmlnLT5yZWdpb24sIGNvbmZpZy0+YmFuZC50eXBlKTsKLQotICAgIHJhZGlvID0gbW9kdWxlLT5hZGRDbGllbnQoY2xpZW50LCBjb25maWcsIHdpdGhBdWRpbyk7Ci0KLSAgICBpZiAocmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcCA9IDYwMDAwOwotCi1zdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKLXsKLSAgICBib29sIGxvY2tlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7Ci0gICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXApOwotICAgIH0KLSAgICByZXR1cm4gbG9ja2VkOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFJhZGlvU2VydmljZSIpOwotICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBSYWRpb1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAotICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiUmFkaW9TZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgcmV0dXJuIEJuUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLQotLyogc3RhdGljICovCi12b2lkIFJhZGlvU2VydmljZTo6Y29udmVydFByb3BlcnRpZXMocmFkaW9fcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKmhhbFByb3BlcnRpZXMpCi17Ci0gICAgbWVtc2V0KHByb3BlcnRpZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgIHByb3BlcnRpZXMtPmNsYXNzX2lkID0gaGFsUHJvcGVydGllcy0+Y2xhc3NfaWQ7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5pbXBsZW1lbnRvciwgaGFsUHJvcGVydGllcy0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5wcm9kdWN0LCBoYWxQcm9wZXJ0aWVzLT5wcm9kdWN0LAotICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+dmVyc2lvbiwgaGFsUHJvcGVydGllcy0+dmVyc2lvbiwKLSAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnNlcmlhbCwgaGFsUHJvcGVydGllcy0+c2VyaWFsLAotICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHByb3BlcnRpZXMtPm51bV90dW5lcnMgPSBoYWxQcm9wZXJ0aWVzLT5udW1fdHVuZXJzOwotICAgIHByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzID0gaGFsUHJvcGVydGllcy0+bnVtX2F1ZGlvX3NvdXJjZXM7Ci0gICAgcHJvcGVydGllcy0+c3VwcG9ydHNfY2FwdHVyZSA9IGhhbFByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoc0tub3duUmVnaW9uQ29uZmlncyk7IGkrKykgewotICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqYmFuZCA9ICZzS25vd25SZWdpb25Db25maWdzW2ldLmJhbmQ7Ci0gICAgICAgIHNpemVfdCBqOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGFsUHJvcGVydGllcy0+bnVtX2JhbmRzOyBqKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpoYWxCYW5kID0gJmhhbFByb3BlcnRpZXMtPmJhbmRzW2pdOwotICAgICAgICAgICAgc2l6ZV90IGs7Ci0gICAgICAgICAgICBpZiAoYmFuZC0+dHlwZSAhPSBoYWxCYW5kLT50eXBlKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChiYW5kLT5sb3dlcl9saW1pdCA8IGhhbEJhbmQtPmxvd2VyX2xpbWl0KSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChiYW5kLT51cHBlcl9saW1pdCA+IGhhbEJhbmQtPnVwcGVyX2xpbWl0KSBjb250aW51ZTsKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoYWxCYW5kLT5udW1fc3BhY2luZ3M7IGsrKykgewotICAgICAgICAgICAgICAgIGlmIChiYW5kLT5zcGFjaW5nc1swXSA9PSBoYWxCYW5kLT5zcGFjaW5nc1trXSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoayA9PSBoYWxCYW5kLT5udW1fc3BhY2luZ3MpIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGJhbmQtPnR5cGUgPT0gUkFESU9fQkFORF9BTSkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoKGJhbmQtPmZtLmRlZW1waGFzaXMgJiBoYWxCYW5kLT5mbS5kZWVtcGhhc2lzKSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChoYWxCYW5kLT5mbS5yZHMgPT0gMCkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoKGJhbmQtPmZtLnJkcyAmIGhhbEJhbmQtPmZtLnJkcykgIT0gMCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPT0gaGFsUHJvcGVydGllcy0+bnVtX2JhbmRzKSBjb250aW51ZTsKLQotICAgICAgICBBTE9HSSgiY29udmVydFByb3BlcnRpZXMoKSBBZGRpbmcgYmFuZCB0eXBlICVkIHJlZ2lvbiAlZCIsCi0gICAgICAgICAgICAgIHNLbm93blJlZ2lvbkNvbmZpZ3NbaV0uYmFuZC50eXBlICwgc0tub3duUmVnaW9uQ29uZmlnc1tpXS5yZWdpb24pOwotCi0gICAgICAgIG1lbWNweSgmcHJvcGVydGllcy0+YmFuZHNbcHJvcGVydGllcy0+bnVtX2JhbmRzKytdLAotICAgICAgICAgICAgICAgJnNLbm93blJlZ2lvbkNvbmZpZ3NbaV0sCi0gICAgICAgICAgICAgICBzaXplb2YocmFkaW9fYmFuZF9jb25maWdfdCkpOwotICAgIH0KLX0KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZCIKLQotUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6Q2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KQotICAgIDogbU1vZHVsZUNsaWVudChtb2R1bGVDbGllbnQpLCBtTWVtb3J5RGVhbGVyKG5ldyBNZW1vcnlEZWFsZXIoMTAyNCAqIDEwMjQsICJSYWRpb1NlcnZpY2UiKSkKLXsKLX0KLQotUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6fkNhbGxiYWNrVGhyZWFkKCkKLXsKLSAgICBtRXZlbnRRdWV1ZS5jbGVhcigpOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQotewotICAgIHJ1bigiUmFkaW9TZXJ2aWNlIGNiayIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKLX0KLQotYm9vbCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKLXsKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7Ci0gICAgICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50OwotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7Ci0gICAgICAgICAgICB3aGlsZSAobUV2ZW50UXVldWUuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgc2xlZXAiKTsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kLndhaXQobUNhbGxiYWNrTG9jayk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgd2FrZSB1cCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV2ZW50TWVtb3J5ID0gbUV2ZW50UXVldWVbMF07Ci0gICAgICAgICAgICBtRXZlbnRRdWV1ZS5yZW1vdmVBdCgwKTsKLSAgICAgICAgICAgIG1vZHVsZUNsaWVudCA9IG1Nb2R1bGVDbGllbnQucHJvbW90ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2R1bGVDbGllbnQgIT0gMCkgewotICAgICAgICAgICAgbW9kdWxlQ2xpZW50LT5vbkNhbGxiYWNrRXZlbnQoZXZlbnRNZW1vcnkpOwotICAgICAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6ZXhpdCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOwotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgbUNhbGxiYWNrQ29uZC5icm9hZGNhc3QoKTsKLX0KLQotc3A8SU1lbW9yeT4gUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6cHJlcGFyZUV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCkKLXsKLSAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKLQotICAgIC8vIFRoZSBldmVudCBsYXlvdXQgaW4gc2hhcmVkIG1lbW9yeSBpczoKLSAgICAvLyBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSBieXRlcyA6IHRoZSBldmVudCBpdHNlbGYKLSAgICAvLyA0IGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ldGFkYXRhIHNpemUgb3IgMAotICAgIC8vIE4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0YWRhdGEgaWYgcHJlc2VudAotICAgIHVpbnQzMl90IG1ldGFkYXRhT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgKyBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKGhhbEV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgaWYgKHJhZGlvX21ldGFkYXRhX2NoZWNrKGhhbEV2ZW50LT5pbmZvLm1ldGFkYXRhKSA9PSAwKSB7Ci0gICAgICAgICAgICBtZXRhZGF0YVNpemUgPSAodWludDMyX3QpcmFkaW9fbWV0YWRhdGFfZ2V0X3NpemUoaGFsRXZlbnQtPmluZm8ubWV0YWRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkFESU9fRVZFTlRfTUVUQURBVEE6Ci0gICAgICAgIGlmIChyYWRpb19tZXRhZGF0YV9jaGVjayhoYWxFdmVudC0+bWV0YWRhdGEpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKLSAgICAgICAgfQotICAgICAgICBtZXRhZGF0YVNpemUgPSAodWludDMyX3QpcmFkaW9fbWV0YWRhdGFfZ2V0X3NpemUoaGFsRXZlbnQtPm1ldGFkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShtZXRhZGF0YU9mZnNldCArIG1ldGFkYXRhU2l6ZSk7Ci0gICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCByYWRpb19ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7Ci0KLSAgICAqKHVpbnQzMl90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCAtIHNpemVvZih1aW50MzJfdCkpID0gbWV0YWRhdGFTaXplOwotCi0gICAgZXZlbnQtPnR5cGUgPSBoYWxFdmVudC0+dHlwZTsKLSAgICBldmVudC0+c3RhdHVzID0gaGFsRXZlbnQtPnN0YXR1czsKLQotICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKLSAgICBjYXNlIFJBRElPX0VWRU5UX0NPTkZJRzoKLSAgICAgICAgZXZlbnQtPmNvbmZpZy5iYW5kID0gaGFsRXZlbnQtPmNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgZXZlbnQtPmluZm8gPSBoYWxFdmVudC0+aW5mbzsKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0LCBoYWxFdmVudC0+aW5mby5tZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX1RBOgotICAgIGNhc2UgUkFESU9fRVZFTlRfRUE6Ci0gICAgY2FzZSBSQURJT19FVkVOVF9BTlRFTk5BOgotICAgIGNhc2UgUkFESU9fRVZFTlRfQ09OVFJPTDoKLSAgICAgICAgZXZlbnQtPm9uID0gaGFsRXZlbnQtPm9uOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgotICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQsIGhhbEV2ZW50LT5tZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX0hXX0ZBSUxVUkU6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGV2ZW50TWVtb3J5OwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnNlbmRFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqZXZlbnQpCi0gewotICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVFdmVudChldmVudCk7Ci0gICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgICBBdXRvTXV0ZXggbG9jayhtQ2FsbGJhY2tMb2NrKTsKLSAgICAgbUV2ZW50UXVldWUuYWRkKGV2ZW50TWVtb3J5KTsKLSAgICAgbUNhbGxiYWNrQ29uZC5zaWduYWwoKTsKLSAgICAgQUxPR1YoIiVzIERPTkUiLCBfX0ZVTkNUSU9OX18pOwotfQotCi0KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZTo6TW9kdWxlIgotCi1SYWRpb1NlcnZpY2U6Ok1vZHVsZTo6TW9kdWxlKHNwPFJhZGlvSW50ZXJmYWNlPiBod0RldmljZSwgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKQotIDogbUh3RGV2aWNlKGh3RGV2aWNlKSwgbVByb3BlcnRpZXMocHJvcGVydGllcyksIG1NdXRlKHRydWUpCi17Ci19Ci0KLVJhZGlvU2VydmljZTo6TW9kdWxlOjp+TW9kdWxlKCkgewotICAgIG1Id0RldmljZS5jbGVhcigpOwotICAgIG1Nb2R1bGVDbGllbnRzLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpkdW1wKGludCBmZCBfX3VudXNlZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3A8UmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ+IFJhZGlvU2VydmljZTo6TW9kdWxlOjphZGRDbGllbnQoY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKQotewotICAgIEFMT0dWKCJhZGRDbGllbnQoKSAlcCBjb25maWcgJXAgcHJvZHVjdCAlcyIsIHRoaXMsIGNvbmZpZywgbVByb3BlcnRpZXMucHJvZHVjdCk7Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiBtb2R1bGVDbGllbnQ7Ci0gICAgaW50IHJldDsKLQotICAgIGlmIChtSHdEZXZpY2UgPT0gMCkgewotICAgICAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5jbGllbnQoKSA9PSBjbGllbnQpIHsKLSAgICAgICAgICAgIC8vIGNsaWVudCBhbHJlYWR5IGNvbm5lY3RlZDogcmVqZWN0Ci0gICAgICAgICAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwotICAgICAgICB9Ci0gICAgfQotICAgIG1vZHVsZUNsaWVudCA9IG5ldyBNb2R1bGVDbGllbnQodGhpcywgY2xpZW50LCBjb25maWcsIGF1ZGlvKTsKLQotICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOwotICAgIGhhbENvbmZpZyA9IGNvbmZpZy0+YmFuZDsKLQotICAgIC8vIFR1bmVyIHByZWVtcHRpb24gbG9naWM6Ci0gICAgLy8gVGhlcmUgaXMgYSBsaW1pdGVkIGFtb3VudCBvZiB0dW5lcnMgYW5kIGEgbGltaXRlZCBhbW91bnQgb2YgcmFkaW8gYXVkaW8gc291cmNlcyBwZXIgbW9kdWxlLgotICAgIC8vIFRoZSBtaW5pbXVtIGlzIG9uZSB0dW5lciBhbmQgb25lIGF1ZGlvIHNvdXJjZS4KLSAgICAvLyBUaGUgbnVtYmVycyBvZiB0dW5lcnMgYW5kIHNvdXJjZXMgYXJlIGluZGljYXRlZCBpbiB0aGUgbW9kdWxlIHByb3BlcnRpZXMuCi0gICAgLy8gTk9URTogY3VycmVudCBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBvbmUgcmFkaW8gYXVkaW8gc291cmNlLgotICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRvIG9wZW4gbW9yZSB0aGFuIG9uZSB0dW5lciBhdCBhIHRpbWUgYnV0IG9ubHkgb25lIHR1bmVyIGNhbiBiZSBjb25uZWN0ZWQKLSAgICAvLyB0byB0aGUgcmFkaW8gYXVkaW8gc291cmNlIChBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLgotICAgIC8vIFRoZSBiYXNlIHJ1bGUgaXMgdGhhdCBhIG5ld2x5IGNvbm5lY3RlZCB0dW5lciBhbHdheXMgd2lucywgaS5lLiBhbHdheXMgZ2V0cyBhIHR1bmVyCi0gICAgLy8gYW5kIGNhbiB1c2UgdGhlIGF1ZGlvIHNvdXJjZSBpZiByZXF1ZXN0ZWQuCi0gICAgLy8gSWYgYW5vdGhlciBjbGllbnQgaXMgcHJlZW1wdGVkLCBpdCBpcyBub3RpZmllZCBieSBhIGNhbGxiYWNrIHdpdGggUkFESU9fRVZFTlRfQ09OVFJPTAotICAgIC8vIGluZGljYXRpbmcgbG9zcyBvZiBjb250cm9sLgotICAgIC8vIC0gSWYgdGhlIG5ld2x5IGNvbm5lY3RlZCBjbGllbnQgcmVxdWVzdHMgdGhlIGF1ZGlvIHNvdXJjZSAoYXVkaW8gPT0gdHJ1ZSk6Ci0gICAgLy8gICAgLSBpZiBhbiBhdWRpbyBzb3VyY2UgaXMgYXZhaWxhYmxlCi0gICAgLy8gICAgICAgICAgbm8gcHJvYmxlbQotICAgIC8vICAgIC0gaWYgbm90OgotICAgIC8vICAgICAgICAgIHRoZSBvbGRlc3QgY2xpZW50IGluIHRoZSBsaXN0IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZC4KLSAgICAvLyAtIElmIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50IGRvZXMgbm90IHJlcXVlc3QgdGhlIGF1ZGlvIHNvdXJjZSAoYXVkaW8gPT0gZmFsc2UpOgotICAgIC8vICAgIC0gaWYgYSB0dW5lciBpcyBhdmFpbGFibGUKLSAgICAvLyAgICAgICAgICBubyBwcm9ibGVtCi0gICAgLy8gICAgLSBpZiBub3Q6Ci0gICAgLy8gICAgICAgICAgVGhlIG9sZGVzdCBjbGllbnQgbm90IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZCBmaXJzdCBhbmQgaWYgbm9uZSBpcyBmb3VuZCB0aGUKLSAgICAvLyAgICAgICAgICB0aGUgb2xkZXN0IGNsaWVudCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQuCi0gICAgLy8gRWFjaCB0aW1lIGEgdHVuZXIgdXNpbmcgdGhlIGF1ZGlvIHNvdXJjZSBpcyBvcGVuZWQgb3IgY2xvc2VkLCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMKLSAgICAvLyBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbiBvciBkaXNjb25uZWN0aW9uIG9mIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUi4KLQotICAgIHNwPE1vZHVsZUNsaWVudD4gb2xkZXN0VHVuZXI7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiBvbGRlc3RBdWRpbzsKLSAgICBzaXplX3QgYWxsb2NhdGVkVHVuZXJzID0gMDsKLSAgICBzaXplX3QgYWxsb2NhdGVkQXVkaW8gPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5nZXRUdW5lcigpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+YXVkaW8oKSkgewotICAgICAgICAgICAgICAgIGlmIChvbGRlc3RBdWRpbyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZGVzdEF1ZGlvID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFsbG9jYXRlZEF1ZGlvKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChvbGRlc3RUdW5lciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZGVzdFR1bmVyID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFsbG9jYXRlZFR1bmVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8VHVuZXJJbnRlcmZhY2U+IGhhbFR1bmVyOwotICAgIHNwPE1vZHVsZUNsaWVudD4gcHJlZW10ZWRDbGllbnQ7Ci0gICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIGlmIChhbGxvY2F0ZWRBdWRpbyA+PSBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcykgewotICAgICAgICAgICAgQUxPR19BU1NFUlQob2xkZXN0QXVkaW8gIT0gMCwgImFkZENsaWVudCgpIGFsbG9jYXRlZEF1ZGlvL29sZGVzdEF1ZGlvIG1pc21hdGNoIik7Ci0gICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdEF1ZGlvOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFsbG9jYXRlZEF1ZGlvICsgYWxsb2NhdGVkVHVuZXJzID49IG1Qcm9wZXJ0aWVzLm51bV90dW5lcnMpIHsKLSAgICAgICAgICAgIGlmIChhbGxvY2F0ZWRUdW5lcnMgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG9sZGVzdFR1bmVyICE9IDAsICJhZGRDbGllbnQoKSBhbGxvY2F0ZWRUdW5lcnMvb2xkZXN0VHVuZXIgbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdFR1bmVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChvbGRlc3RBdWRpbyAhPSAwLCAiYWRkQ2xpZW50KCkgYWxsb2NhdGVkQXVkaW8vb2xkZXN0QXVkaW8gbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdEF1ZGlvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwcmVlbXRlZENsaWVudCAhPSAwKSB7Ci0gICAgICAgIGhhbFR1bmVyID0gcHJlZW10ZWRDbGllbnQtPmdldFR1bmVyKCk7Ci0gICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiBjbGVhcjsKLSAgICAgICAgcHJlZW10ZWRDbGllbnQtPnNldFR1bmVyKGNsZWFyKTsKLSAgICAgICAgbUh3RGV2aWNlLT5jbG9zZVR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgaWYgKHByZWVtdGVkQ2xpZW50LT5hdWRpbygpKSB7Ci0gICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGZhbHNlLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXQgPSBtSHdEZXZpY2UtPm9wZW5UdW5lcigmaGFsQ29uZmlnLCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsVHVuZXIpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICBBTE9HVigiYWRkQ2xpZW50KCkgc2V0VHVuZXIgJXAiLCBoYWxUdW5lci5nZXQoKSk7Ci0gICAgICAgIG1vZHVsZUNsaWVudC0+c2V0VHVuZXIoaGFsVHVuZXIpOwotICAgICAgICBtTW9kdWxlQ2xpZW50cy5hZGQobW9kdWxlQ2xpZW50KTsKLSAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKHRydWUsICIiKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiYWRkQ2xpZW50KCkgRE9ORSBtb2R1bGVDbGllbnQgJXAiLCBtb2R1bGVDbGllbnQuZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCIlcyBvcGVuX3R1bmVyIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgICAgICBtb2R1bGVDbGllbnQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlOjpyZW1vdmVDbGllbnQoY29uc3Qgc3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KSB7Ci0gICAgQUxPR1YoInJlbW92ZUNsaWVudCgpIik7Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIGludCByZXQ7Ci0gICAgc3NpemVfdCBpbmRleCA9IC0xOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlQ2xpZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0gPT0gbW9kdWxlQ2xpZW50KSB7Ci0gICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1Nb2R1bGVDbGllbnRzLnJlbW92ZUF0KGluZGV4KTsKLSAgICBzcDxUdW5lckludGVyZmFjZT4gaGFsVHVuZXIgPSBtb2R1bGVDbGllbnQtPmdldFR1bmVyKCk7Ci0gICAgaWYgKGhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSHdEZXZpY2UgIT0gMCkgewotICAgICAgICBtSHdEZXZpY2UtPmNsb3NlVHVuZXIoaGFsVHVuZXIpOwotICAgIH0KLQotICAgIGlmIChtb2R1bGVDbGllbnQtPmF1ZGlvKCkpIHsKLSAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihmYWxzZSwgIiIpOwotICAgIH0KLQotICAgIG1NdXRlID0gdHJ1ZTsKLQotICAgIGlmIChtTW9kdWxlQ2xpZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSHdEZXZpY2UgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVHVuZXIgcmVhbGxvY2F0aW9uIGxvZ2ljOgotICAgIC8vIFdoZW4gYSBjbGllbnQgaXMgcmVtb3ZlZCBhbmQgd2FzIGNvbnRyb2xsaW5nIGEgdHVuZXIsIHRoaXMgdHVuZXIgd2lsbCBiZSBhbGxvY2F0ZWQgdG8gYQotICAgIC8vIHByZXZpb3VzbHkgcHJlZW1wdGVkIGNsaWVudC4gVGhpcyBjbGllbnQgd2lsbCBiZSBub3RpZmllZCBieSBhIGNhbGxiYWNrIHdpdGgKLSAgICAvLyBSQURJT19FVkVOVF9DT05UUk9MIGluZGljYXRpbmcgZ2FpbiBvZiBjb250cm9sLgotICAgIC8vIC0gSWYgYSBwcmVlbXB0ZWQgY2xpZW50IGlzIHdhaXRpbmcgZm9yIGFuIGF1ZGlvIHNvdXJjZSBhbmQgb25lIGJlY29tZXMgYXZhaWxhYmxlOgotICAgIC8vICAgIEFsbG9jYXRlIHRoZSB0dW5lciB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjbGllbnQgd2FpdGluZyBmb3IgYW4gYXVkaW8gc291cmNlCi0gICAgLy8gLSBJZiBub3Q6Ci0gICAgLy8gICAgQWxsb2NhdGUgdGhlIHR1bmVyIHRvIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNsaWVudC4KLSAgICAvLyBFYWNoIHRpbWUgYSB0dW5lciB1c2luZyB0aGUgYXVkaW8gc291cmNlIGlzIG9wZW5lZCBvciBjbG9zZWQsIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcwotICAgIC8vIG5vdGlmaWVkIG9mIHRoZSBjb25uZWN0aW9uIG9yIGRpc2Nvbm5lY3Rpb24gb2YgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLgotCi0gICAgc3A8TW9kdWxlQ2xpZW50PiB5b3VuZ2VzdENsaWVudDsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IHlvdW5nZXN0Q2xpZW50QXVkaW87Ci0gICAgc2l6ZV90IGFsbG9jYXRlZFR1bmVycyA9IDA7Ci0gICAgc2l6ZV90IGFsbG9jYXRlZEF1ZGlvID0gMDsKLSAgICBmb3IgKHNzaXplX3QgaSA9IG1Nb2R1bGVDbGllbnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Z2V0VHVuZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmF1ZGlvKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoeW91bmdlc3RDbGllbnRBdWRpbyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHlvdW5nZXN0Q2xpZW50QXVkaW8gPSBtTW9kdWxlQ2xpZW50c1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh5b3VuZ2VzdENsaWVudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHlvdW5nZXN0Q2xpZW50ID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5hdWRpbygpKSB7Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVkQXVkaW8rKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVkVHVuZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HX0FTU0VSVChhbGxvY2F0ZWRUdW5lcnMgKyBhbGxvY2F0ZWRBdWRpbyA8IG1Qcm9wZXJ0aWVzLm51bV90dW5lcnMsCi0gICAgICAgICAgICAgICAgInJlbW92ZUNsaWVudCgpIHJlbW92ZWQgY2xpZW50IGJ1dCBubyB0dW5lciBhdmFpbGFibGUiKTsKLQotICAgIEFMT0dfQVNTRVJUKCFtb2R1bGVDbGllbnQtPmF1ZGlvKCkgfHwgYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcywKLSAgICAgICAgICAgICAgICAicmVtb3ZlQ2xpZW50KCkgcmVtb3ZlZCBhdWRpbyBjbGllbnQgYnV0IG5vIHR1bmVyIHdpdGggYXVkaW8gYXZhaWxhYmxlIik7Ci0KLSAgICBpZiAoYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcyAmJiB5b3VuZ2VzdENsaWVudEF1ZGlvICE9IDApIHsKLSAgICAgICAgeW91bmdlc3RDbGllbnQgPSB5b3VuZ2VzdENsaWVudEF1ZGlvOwotICAgIH0KLQotICAgIEFMT0dfQVNTRVJUKHlvdW5nZXN0Q2xpZW50ICE9IDAsICJyZW1vdmVDbGllbnQoKSByZW1vdmVkIGNsaWVudCBubyBjYW5kaWRhdGUgZm91bmQgZm9yIHR1bmVyIik7Ci0KLSAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZyA9IHlvdW5nZXN0Q2xpZW50LT5oYWxDb25maWcoKTsKLSAgICByZXQgPSBtSHdEZXZpY2UtPm9wZW5UdW5lcigmaGFsQ29uZmlnLCB5b3VuZ2VzdENsaWVudC0+YXVkaW8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxUdW5lcik7Ci0KLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgeW91bmdlc3RDbGllbnQtPnNldFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgaWYgKHlvdW5nZXN0Q2xpZW50LT5hdWRpbygpKSB7Ci0gICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKHRydWUsICIiKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG11dGUgIT0gbU11dGUpIHsKLSAgICAgICAgbU11dGUgPSBtdXRlOwotICAgICAgICAvL1RPRE8gbm90aWZpZnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb2YgbWVkaWEgYWN0aXZpdHkgb24gcmFkaW8gYXVkaW8gZGV2aWNlCi0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmdldE11dGUoYm9vbCAqbXV0ZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICptdXRlID0gbU11dGU7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLWNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmdldERlZmF1bHRDb25maWcoKSBjb25zdAotewotICAgIGlmIChtUHJvcGVydGllcy5udW1fYmFuZHMgPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuICZtUHJvcGVydGllcy5iYW5kc1swXTsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6bm90aWZ5RGV2aWNlQ29ubmVjdGlvbihib29sIGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcykgewotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID8gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywga1JhZGlvVHVuZXJBdWRpb0RldmljZU5hbWUpOwotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotfQotCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudCIKLQotUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Ok1vZHVsZUNsaWVudChjb25zdCBzcDxNb2R1bGU+JiBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8pCi0gOiBtTW9kdWxlKG1vZHVsZSksIG1DbGllbnQoY2xpZW50KSwgbUNvbmZpZygqY29uZmlnKSwgbUF1ZGlvKGF1ZGlvKSwgbVR1bmVyKDApCi17Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uRmlyc3RSZWYoKQotewotICAgIG1DYWxsYmFja1RocmVhZCA9IG5ldyBDYWxsYmFja1RocmVhZCh0aGlzKTsKLSAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2xpZW50KS0+bGlua1RvRGVhdGgodGhpcyk7Ci19Ci0KLVJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50Ojp+TW9kdWxlQ2xpZW50KCkgewotICAgIGlmIChtQ2xpZW50ICE9IDApIHsKLSAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPnVubGlua1RvRGVhdGgodGhpcyk7Ci0gICAgICAgIG1DbGllbnQuY2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOwotICAgIH0KLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6b25FdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpCi17Ci0gICAgbUNhbGxiYWNrVGhyZWFkLT5zZW5kRXZlbnQoaGFsRXZlbnQpOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6ZHVtcChpbnQgZmQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpkZXRhY2goKSB7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IHN0cm9uZ01lID0gdGhpczsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPnVubGlua1RvRGVhdGgodGhpcyk7Ci0gICAgICAgICAgICBtQ2xpZW50LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtb2R1bGUtPnJlbW92ZUNsaWVudCh0aGlzKTsKLX0KLQotcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmhhbENvbmZpZygpIGNvbnN0Ci17Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBtQ29uZmlnLmJhbmQ7Ci19Ci0KLXNwPFR1bmVySW50ZXJmYWNlPiYgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldFR1bmVyKCkKLXsKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIG1UdW5lcjsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0VHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBBTE9HVigiJXMgJXAiLCBfX0ZVTkNUSU9OX18sIHRoaXMpOwotCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIG1UdW5lciA9IHR1bmVyOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0NPTlRST0w7Ci0gICAgZXZlbnQuc3RhdHVzID0gMDsKLSAgICBldmVudC5vbiA9IG1UdW5lciAhPSAwOwotICAgIG1DYWxsYmFja1RocmVhZC0+c2VuZEV2ZW50KCZldmVudCk7Ci0gICAgQUxPR1YoIiVzIERPTkUiLCBfX0ZVTkNUSU9OX18pOwotCi19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOwotICAgICAgICBoYWxDb25maWcgPSBjb25maWctPmJhbmQ7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnNldENvbmZpZ3VyYXRpb24oJmhhbENvbmZpZyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1Db25maWcgPSAqY29uZmlnOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUNvbmZpZyA9ICpjb25maWc7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOwotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5nZXRDb25maWd1cmF0aW9uKCZoYWxDb25maWcpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ29uZmlnLmJhbmQgPSBoYWxDb25maWc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKmNvbmZpZyA9IG1Db25maWc7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0TXV0ZShib29sIG11dGUpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBpZiAobVR1bmVyID09IDAgfHwgIW1BdWRpbykgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwotICAgICAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgfQotICAgIG1vZHVsZS0+c2V0TXV0ZShtdXRlKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbW9kdWxlLT5nZXRNdXRlKG11dGUpOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zY2FuKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zdGVwKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6dHVuZSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+dHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmNhbmNlbCgpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5jYW5jZWwoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKGluZm8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgKmhhc0NvbnRyb2wgPSBtVHVuZXIgIT0gMDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCi17Ci0gICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudDsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJhZGlvX2V2ZW50X3QgKmV2ZW50ID0gKHJhZGlvX2V2ZW50X3QgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotICAgICAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgICAgIGNhc2UgUkFESU9fRVZFTlRfQ09ORklHOgotICAgICAgICAgICAgbUNvbmZpZy5iYW5kID0gZXZlbnQtPmNvbmZpZy5iYW5kOwotICAgICAgICAgICAgZXZlbnQtPmNvbmZpZy5yZWdpb24gPSBtQ29uZmlnLnJlZ2lvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGllbnQgPSBtQ2xpZW50OwotICAgIH0KLSAgICBpZiAoY2xpZW50ICE9IDApIHsKLSAgICAgICAgY2xpZW50LT5vbkV2ZW50KGV2ZW50TWVtb3J5KTsKLSAgICB9Ci19Ci0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6YmluZGVyRGllZCgKLSAgICBjb25zdCB3cDxJQmluZGVyPiAmd2hvIF9fdW51c2VkKSB7Ci0gICAgQUxPR1coImNsaWVudCBiaW5kZXIgZGllZCBmb3IgY2xpZW50ICVwIiwgdGhpcyk7Ci0gICAgZGV0YWNoKCk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRlYjdhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLS8vI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lBcHBPcHNDYWxsYmFjay5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9yYWRpby5oPgotI2luY2x1ZGUgIlJhZGlvSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVtb3J5SGVhcEJhc2U7Ci0KLWNsYXNzIFJhZGlvU2VydmljZSA6Ci0gICAgcHVibGljIEJpbmRlclNlcnZpY2U8UmFkaW9TZXJ2aWNlPiwKLSAgICBwdWJsaWMgQm5SYWRpb1NlcnZpY2UKLXsKLSAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxSYWRpb1NlcnZpY2U+OwotCi1wdWJsaWM6Ci0gICAgY2xhc3MgTW9kdWxlQ2xpZW50OwotICAgIGNsYXNzIE1vZHVsZTsKLQotICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5yYWRpbyI7IH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TZXJ2aWNlKCk7Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+UmFkaW9TZXJ2aWNlKCk7Ci0KLSAgICAvLyBJUmFkaW9TZXJ2aWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLQotICAgIGNsYXNzIE1vZHVsZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLQotICAgICAgIE1vZHVsZShzcDxSYWRpb0ludGVyZmFjZT4gaHdEZXZpY2UsCi0gICAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIHByb3BlcnRpZXMpOwotCi0gICAgICAgdmlydHVhbCB+TW9kdWxlKCk7Ci0KLSAgICAgICAgICAgICAgIHNwPE1vZHVsZUNsaWVudD4gYWRkQ2xpZW50KGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKTsKLQotICAgICAgICAgICAgICAgdm9pZCByZW1vdmVDbGllbnQoY29uc3Qgc3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KTsKLQotICAgICAgICAgICAgICAgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpOwotCi0gICAgICAgICAgICAgICBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICAgICBzcDxSYWRpb0ludGVyZmFjZT4gaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KLSAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gbVByb3BlcnRpZXM7IH0KLSAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmdldERlZmF1bHRDb25maWcoKSBjb25zdCA7Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgdm9pZCBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGJvb2wgY29ubmVjdGVkLCBjb25zdCBjaGFyICphZGRyZXNzKTsKLQotICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgLy8gcHJvdGVjdHMgIG1Nb2R1bGVDbGllbnRzCi0gICAgICAgIHNwPFJhZGlvSW50ZXJmYWNlPiAgICAgICAgICAgIG1Id0RldmljZTsgICAgICAvLyBIQUwgaGFyZHdhcmUgZGV2aWNlCi0gICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIG1Qcm9wZXJ0aWVzOyAgICAvLyBjYWNoZWQgaGFyZHdhcmUgbW9kdWxlIHByb3BlcnRpZXMKLSAgICAgICAgVmVjdG9yPCBzcDxNb2R1bGVDbGllbnQ+ID4gICAgbU1vZHVsZUNsaWVudHM7IC8vIGxpc3Qgb2YgYXR0YWNoZWQgY2xpZW50cwotICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtTXV0ZTsgICAgICAgICAgLy8gcmFkaW8gYXVkaW8gc291cmNlIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHVubXV0ZWQsIGF1ZGlvIGlzIHJvdXRlZCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgZm9yIG1lZGlhIHVzZSBjYXNlLgotICAgIH07IC8vIGNsYXNzIE1vZHVsZQotCi0gICAgY2xhc3MgQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KTsKLQotICAgICAgICB2aXJ0dWFsIH5DYWxsYmFja1RocmVhZCgpOwotCi0KLSAgICAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCi0gICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7Ci0KLSAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgICAgICAgICAgICAgdm9pZCBleGl0KCk7Ci0KLSAgICAgICAgICAgICAgICB2b2lkIHNlbmRFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOwotICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgd3A8TW9kdWxlQ2xpZW50PiAgICAgIG1Nb2R1bGVDbGllbnQ7ICAgIC8vIGNsaWVudCBtb2R1bGUgdGhlIHRocmVhZCBiZWxvbmdzIHRvCi0gICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kOyAgICAvLyBjb25kaXRpb24gc2lnbmFsZWQgd2hlbiBhIG5ldyBldmVudCBpcyBwb3N0ZWQKLSAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgIG1DYWxsYmFja0xvY2s7ICAgIC8vIHByb3RlY3RzIG1FdmVudFF1ZXVlCi0gICAgICAgIFZlY3Rvcjwgc3A8SU1lbW9yeT4gPiBtRXZlbnRRdWV1ZTsgICAgICAvLyBwZW5kaW5nIGNhbGxiYWNrIGV2ZW50cwotICAgICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgICAgbU1lbW9yeURlYWxlcjsgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgY2FsbGJhY2sgZXZlbnQKLSAgICB9OyAvLyBjbGFzcyBDYWxsYmFja1RocmVhZAotCi0gICAgY2xhc3MgTW9kdWxlQ2xpZW50IDogcHVibGljIEJuUmFkaW8sCi0gICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAotICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUdW5lckNhbGxiYWNrSW50ZXJmYWNlIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICBNb2R1bGVDbGllbnQoY29uc3Qgc3A8TW9kdWxlPiYgbW9kdWxlLAotICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICBib29sIGF1ZGlvKTsKLQotICAgICAgIHZpcnR1YWwgfk1vZHVsZUNsaWVudCgpOwotCi0gICAgICAgLy8gSVJhZGlvCi0gICAgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsKCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgICAgICAgICAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudCgpIGNvbnN0IHsgcmV0dXJuIG1DbGllbnQ7IH0KLSAgICAgICAgICAgICAgIHdwPE1vZHVsZT4gbW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZTsgfQotICAgICAgICAgICAgICAgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgaGFsQ29uZmlnKCkgY29uc3Q7Ci0gICAgICAgICAgICAgICBzcDxDYWxsYmFja1RocmVhZD4gY2FsbGJhY2tUaHJlYWQoKSBjb25zdCB7IHJldHVybiBtQ2FsbGJhY2tUaHJlYWQ7IH0KLSAgICAgICAgICAgICAgIHZvaWQgc2V0VHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0gICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIGdldFR1bmVyKCk7Ci0gICAgICAgICAgICAgICBib29sIGF1ZGlvKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvOyB9Ci0KLSAgICAgICAgICAgICAgIHZvaWQgb25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudCk7Ci0KLSAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0KLSAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgotICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKLQotICAgICAgIC8vIFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UKLSAgICAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChyYWRpb19oYWxfZXZlbnRfdCAqZXZlbnQpOwotCi0gICAgcHJpdmF0ZToKLQotICAgICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgICAgICAvLyBwcm90ZWN0cyBtQ2xpZW50LCBtQ29uZmlnIGFuZCBtVHVuZXIKLSAgICAgICAgd3A8TW9kdWxlPiAgICAgICAgICAgICAgICAgIG1Nb2R1bGU7ICAgICAgICAgLy8gVGhlIG1vZHVsZSB0aGlzIGNsaWVudCBpcyBhdHRhY2hlZCB0bwotICAgICAgICBzcDxJUmFkaW9DbGllbnQ+ICAgICAgICAgICAgbUNsaWVudDsgICAgICAgICAvLyBldmVudCBjYWxsYmFjayBiaW5kZXIgaW50ZXJmYWNlCi0gICAgICAgIHJhZGlvX2JhbmRfY29uZmlnX3QgICAgICAgICBtQ29uZmlnOyAgICAgICAgIC8vIGN1cnJlbnQgYmFuZCBjb25maWd1cmF0aW9uCi0gICAgICAgIHNwPENhbGxiYWNrVGhyZWFkPiAgICAgICAgICBtQ2FsbGJhY2tUaHJlYWQ7IC8vIGV2ZW50IGNhbGxiYWNrIHRocmVhZAotICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUF1ZGlvOwotICAgICAgICBzcDxUdW5lckludGVyZmFjZT4gICAgICAgICAgbVR1bmVyOyAgICAgICAgLy8gSEFMIHR1bmVyIGludGVyZmFjZS4gTlVMTCBpbmRpY2F0ZXMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2xpZW50IGRvZXMgbm90IGhhdmUgY29udHJvbCBvbiBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0dW5lcgotICAgIH07IC8vIGNsYXNzIE1vZHVsZUNsaWVudAotCi0KLSAgICBzdGF0aWMgdm9pZCBjYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQsIHZvaWQgKmNvb2tpZSk7Ci0KLXByaXZhdGU6Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgc3RhdGljIHZvaWQgY29udmVydFByb3BlcnRpZXMocmFkaW9fcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKmhhbFByb3BlcnRpZXMpOwotICAgIE11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOyAgIC8vIHByb3RlY3RzIG1Nb2R1bGVzCi0gICAgdm9sYXRpbGUgaW50MzJfdCAgICBtTmV4dFVuaXF1ZUlkOyAgLy8gZm9yIG1vZHVsZSBJRCBhbGxvY2F0aW9uCi0gICAgRGVmYXVsdEtleWVkVmVjdG9yPCByYWRpb19oYW5kbGVfdCwgc3A8TW9kdWxlPiA+IG1Nb2R1bGVzOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1R1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL3JhZGlvL1R1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3M2NjZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9UdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0NBTExCQUNLX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVFVORVJfQ0FMTEJBQ0tfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBUdW5lckNhbGxiYWNrSW50ZXJmYWNlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQotewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpldmVudCkgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgIFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UoKSB7fQotICAgIHZpcnR1YWwgICAgICB+VHVuZXJDYWxsYmFja0ludGVyZmFjZSgpIHt9Ci0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVFVORVJfQ0FMTEJBQ0tfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1R1bmVySW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9yYWRpby9UdW5lckludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTY1N2QzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1R1bmVySW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9JTlRFUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVHVuZXJJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IGN1cnJlbnQgcmFkaW8gYmFuZCBjb25maWd1cmF0aW9uIChiYW5kLCByYW5nZSwgY2hhbm5lbCBzcGFjaW5nIC4uLikuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBjb25maWc6IHRoZSBiYW5kIGNvbmZpZ3VyYXRpb24gdG8gYXBwbHkKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgY29uZmlndXJhdGlvbiBjb3VsZCBiZSBhcHBsaWVkCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkIGlzIGludmFsaWQKLSAgICAgICAgICoKLSAgICAgICAgICogQXV0b21hdGljYWxseSBjYW5jZWxzIHBlbmRpbmcgc2Nhbiwgc3RlcCBvciB0dW5lLgotICAgICAgICAgKgotICAgICAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX0NPTkZJRyBNVVNUIGJlIGNhbGxlZCBvbmNlIHRoZQotICAgICAgICAgKiBjb25maWd1cmF0aW9uIGlzIGFwcGxpZWQgb3IgYSBmYWlsdXJlIG9jY3VycyBvciBhZnRlciBhIHRpbWUgb3V0LgotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXRyaWV2ZSBjdXJyZW50IHJhZGlvIGJhbmQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGNvbmZpZzogd2hlcmUgdG8gcmV0dXJuIHRoZSBiYW5kIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgdmFsaWQgY29uZmlndXJhdGlvbiBpcyByZXR1cm5lZAotICAgICAgICAgKiAgLUVJTlZBTCBpZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IGdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0YXJ0IHNjYW5uaW5nIHVwIHRvIG5leHQgdmFsaWQgc3RhdGlvbi4KLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgd2hlbiBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gYXBwbGllZC4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGRpcmVjdGlvbjogUkFESU9fRElSRUNUSU9OX1VQIG9yIFJBRElPX0RJUkVDVElPTl9ET1dOCi0gICAgICAgICAqIC0gc2tpcF9zdWJfY2hhbm5lbDogdmFsaWQgZm9yIEhEIHJhZGlvIG9yIGRpZ2l0YWwgcmFkaW9zIG9ubHk6IGlnbm9yZSBzdWIgY2hhbm5lbHMKLSAgICAgICAgICogIChlLmcgU1BTIGZvciBIRCByYWRpbykuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHNjYW4gc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKgotICAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgcGVuZGluZyBzY2FuLCBzdGVwIG9yIHR1bmUuCi0gICAgICAgICAqCi0gICAgICAgICAqICBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX1RVTkVEIE1VU1QgYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICogIGxvY2tlZCBvbiBhIHN0YXRpb24gb3IgYWZ0ZXIgYSB0aW1lIG91dCBvciBmdWxsIGZyZXF1ZW5jeSBzY2FuIGlmCi0gICAgICAgICAqICBubyBzdGF0aW9uIGZvdW5kLiBUaGUgZXZlbnQgc3RhdHVzIHNob3VsZCBpbmRpY2F0ZSBpZiBhIHZhbGlkIHN0YXRpb24KLSAgICAgICAgICogIGlzIHR1bmVkIG9yIG5vdC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE1vdmUgb25lIGNoYW5uZWwgc3BhY2luZyB1cCBvciBkb3duLgotICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCB3aGVuIGEgdmFsaWQgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhcHBsaWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gZGlyZWN0aW9uOiBSQURJT19ESVJFQ1RJT05fVVAgb3IgUkFESU9fRElSRUNUSU9OX0RPV04KLSAgICAgICAgICogLSBza2lwX3N1Yl9jaGFubmVsOiB2YWxpZCBmb3IgSEQgcmFkaW8gb3IgZGlnaXRhbCByYWRpb3Mgb25seTogaWdub3JlIHN1YiBjaGFubmVscwotICAgICAgICAgKiAgKGUuZyBTUFMgZm9yIEhEIHJhZGlvKS4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgc3RlcCBzdWNjZXNzZnVsbHkgc3RhcnRlZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqICAtRU5PREVWIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2FuY2VscyBwZW5kaW5nIHNjYW4sIHN0ZXAgb3IgdHVuZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9UVU5FRCBNVVNUIGJlIGNhbGxlZCBvbmNlCi0gICAgICAgICAqIHN0ZXAgY29tcGxldGVkIG9yIGFmdGVyIGEgdGltZSBvdXQuIFRoZSBldmVudCBzdGF0dXMgc2hvdWxkIGluZGljYXRlCi0gICAgICAgICAqIGlmIGEgdmFsaWQgc3RhdGlvbiBpcyB0dW5lZCBvciBub3QuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUdW5lIHRvIHNwZWNpZmllZCBmcmVxdWVuY3kuCi0gICAgICAgICAqIE11c3QgYmUgY2FsbGVkIHdoZW4gYSB2YWxpZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGFwcGxpZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBjaGFubmVsOiBjaGFubmVsIHRvIHR1bmUgdG8uIEEgZnJlcXVlbmN5IGluIGtIeiBmb3IgQU0vRk0vSEQgUmFkaW8gYmFuZHMuCi0gICAgICAgICAqIC0gc3ViX2NoYW5uZWw6IHZhbGlkIGZvciBIRCByYWRpbyBvciBkaWdpdGFsIHJhZGlvcyBvbmx5OiAoZS5nIFNQUyBudW1iZXIgZm9yIEhEIHJhZGlvKS4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgdHVuZSBzdWNjZXNzZnVsbHkgc3RhcnRlZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICoKLSAgICAgICAgICogQXV0b21hdGljYWxseSBjYW5jZWxzIHBlbmRpbmcgc2Nhbiwgc3RlcCBvciB0dW5lLgotICAgICAgICAgKgotICAgICAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX1RVTkVEIE1VU1QgYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICogdHVuZWQgb3IgYWZ0ZXIgYSB0aW1lIG91dC4gVGhlIGV2ZW50IHN0YXR1cyBzaG91bGQgaW5kaWNhdGUKLSAgICAgICAgICogaWYgYSB2YWxpZCBzdGF0aW9uIGlzIHR1bmVkIG9yIG5vdC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1Yl9jaGFubmVsKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2FuY2VsIGEgc2Nhbiwgc3RlcCBvciB0dW5lIG9wZXJhdGlvbi4KLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgYSBzY2FuLCBzdGVwIG9yIHR1bmUgb3BlcmF0aW9uIGlzIHBlbmRpbmcKLSAgICAgICAgICogKGNhbGxiYWNrIG5vdCB5ZXQgc2VudCkuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHN1Y2Nlc3NmdWwKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgbm90IHNlbnQuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IGNhbmNlbCgpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXRyaWV2ZSBjdXJyZW50IHN0YXRpb24gaW5mb3JtYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBpbmZvOiB3aGVyZSB0byByZXR1cm4gdGhlIHByb2dyYW0gaW5mby4KLSAgICAgICAgICogSWYgaW5mby0+bWV0YWRhdGEgaXMgTlVMTC4gbm8gbWV0YSBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICAgICAgICogSWYgbWV0YSBkYXRhIG11c3QgYmUgcmV0dXJuZWQsIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvIG9yIGNsb25lZCB0bwotICAgICAgICAgKiBpbmZvLT5tZXRhZGF0YSwgbm90IHBhc3NlZCBmcm9tIGEgbmV3bHkgY3JlYXRlZCBtZXRhIGRhdGEgYnVmZmVyLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiB0dW5lZCBhbmQgaW5mb3JtYXRpb24gYXZhaWxhYmxlCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgICAgICAgICBUdW5lckludGVyZmFjZSgpIHt9Ci0gICAgdmlydHVhbCAgICAgflR1bmVySW50ZXJmYWNlKCkge30KLQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL09XTkVSUyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzZjZiOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9PV05FUlMKQEAgLTAsMCArMSwyIEBACitlbGF1cmVudEBnb29nbGUuY29tCit0aG9ybnRvbmNAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL09XTkVSUyBiL3NvdW5kdHJpZ2dlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzZjZiOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9PV05FUlMKQEAgLTAsMCArMSwyIEBACitlbGF1cmVudEBnb29nbGUuY29tCit0aG9ybnRvbmNAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdG9vbHMvT1dORVJTIGIvdG9vbHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkY2IwMzUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9PV05FUlMKQEAgLTAsMCArMSBAQAorZ2thc3RlbkBhbmRyb2lkLmNvbQo=