ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGIyMDdhOTYuLmEzNjc5YjEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw2ICsyLDUgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKLSAgICAicmFkaW8iLAogICAgICJzb3VuZHRyaWdnZXIiLAogXQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA2NmY1ZmMyLi4xZGQ1MTM5IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtNSwyNiArNSwxNCBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYWRybSIsCiAKLSAgICBhaWRsOiB7Ci0gICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJhaWRsIl0sCi0gICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCi0gICAgfSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsIiwKLQotICAgICAgICAiQ2FzSW1wbC5jcHAiLAotICAgICAgICAiRGVzY3JhbWJsZXJJbXBsLmNwcCIsCiAgICAgICAgICJEcm1QbHVnaW5QYXRoLmNwcCIsCiAgICAgICAgICJEcm1TZXNzaW9uTWFuYWdlci5jcHAiLAogICAgICAgICAiSUNyeXB0by5jcHAiLAogICAgICAgICAiSURybS5jcHAiLAogICAgICAgICAiSURybUNsaWVudC5jcHAiLAogICAgICAgICAiSU1lZGlhRHJtU2VydmljZS5jcHAiLAotICAgICAgICAiTWVkaWFDYXNEZWZzLmNwcCIsCiAgICAgICAgICJTaGFyZWRMaWJyYXJ5LmNwcCIsCiAgICAgICAgICJEcm1IYWwuY3BwIiwKICAgICAgICAgIkNyeXB0b0hhbC5jcHAiLApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTMzYmIwLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9DYXNJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDYXNJbXBsIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvQ2FzQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQ2FzSW1wbC5oPgotI2luY2x1ZGUgPG1lZGlhL1NoYXJlZExpYnJhcnkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgU3RhdHVzIGdldEJpbmRlclN0YXR1cyhzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX1NUQVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycik7Ci19Ci0KLXN0YXRpYyBTdHJpbmc4IHNlc3Npb25JZFRvU3RyaW5nKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXNzaW9uSWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCAiLCBzZXNzaW9uSWRbaV0pOwotICAgIH0KLSAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIobnVsbCkiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RydWN0IENhc0ltcGw6OlBsdWdpbkhvbGRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBQbHVnaW5Ib2xkZXIoQ2FzUGx1Z2luICpwbHVnaW4pIDogbVBsdWdpbihwbHVnaW4pIHt9Ci0gICAgflBsdWdpbkhvbGRlcigpIHsgaWYgKG1QbHVnaW4gIT0gTlVMTCkgZGVsZXRlIG1QbHVnaW47IH0KLSAgICBDYXNQbHVnaW4qIGdldCgpIHsgcmV0dXJuIG1QbHVnaW47IH0KLQotcHJpdmF0ZToKLSAgICBDYXNQbHVnaW4gKm1QbHVnaW47Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGx1Z2luSG9sZGVyKTsKLX07Ci0KLUNhc0ltcGw6OkNhc0ltcGwoY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIpCi0gICAgOiBtUGx1Z2luSG9sZGVyKE5VTEwpLCBtTGlzdGVuZXIobGlzdGVuZXIpIHsKLSAgICBBTE9HVigiQ1RPUiIpOwotfQotCi1DYXNJbXBsOjp+Q2FzSW1wbCgpIHsKLSAgICBBTE9HVigiRFRPUiIpOwotICAgIHJlbGVhc2UoKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ2FzSW1wbDo6T25FdmVudCgKLSAgICAgICAgdm9pZCAqYXBwRGF0YSwKLSAgICAgICAgaW50MzJfdCBldmVudCwKLSAgICAgICAgaW50MzJfdCBhcmcsCi0gICAgICAgIHVpbnQ4X3QgKmRhdGEsCi0gICAgICAgIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKGFwcERhdGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBhcHBEYXRhISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENhc0ltcGwgKmNhc0ltcGwgPSBzdGF0aWNfY2FzdDxDYXNJbXBsICo+KGFwcERhdGEpOwotICAgIGNhc0ltcGwtPm9uRXZlbnQoZXZlbnQsIGFyZywgZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ2FzSW1wbDo6aW5pdChjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgQ2FzUGx1Z2luICpwbHVnaW4pIHsKLSAgICBtTGlicmFyeSA9IGxpYnJhcnk7Ci0gICAgbVBsdWdpbkhvbGRlciA9IG5ldyBQbHVnaW5Ib2xkZXIocGx1Z2luKTsKLX0KLQotdm9pZCBDYXNJbXBsOjpvbkV2ZW50KAotICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUxpc3RlbmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiBldmVudERhdGE7Ci0gICAgaWYgKGRhdGEgIT0gTlVMTCAmJiBzaXplID4gMCkgewotICAgICAgICBldmVudERhdGEucmVzZXQobmV3IENhc0RhdGEoZGF0YSwgZGF0YSArIHNpemUpKTsKLSAgICB9Ci0KLSAgICBtTGlzdGVuZXItPm9uRXZlbnQoZXZlbnQsIGFyZywgZXZlbnREYXRhKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIHsKLSAgICBBTE9HVigic2V0UHJpdmF0ZURhdGEiKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnNldFByaXZhdGVEYXRhKHB2dERhdGEpKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6Om9wZW5TZXNzaW9uKENhc1Nlc3Npb25JZCogc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoIm9wZW5TZXNzaW9uIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gaG9sZGVyLT5nZXQoKS0+b3BlblNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIEFMT0dWKCJvcGVuU2Vzc2lvbjogc2Vzc2lvbiBvcGVuZWQsIHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZygqc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGVycik7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpzZXRTZXNzaW9uUHJpdmF0ZURhdGEoCi0gICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBjb25zdCBDYXNEYXRhJiBwdnREYXRhKSB7Ci0gICAgQUxPR1YoInNldFNlc3Npb25Qcml2YXRlRGF0YTogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+c2V0U2Vzc2lvblByaXZhdGVEYXRhKHNlc3Npb25JZCwgcHZ0RGF0YSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6Y2xvc2VTZXNzaW9uKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoImNsb3NlU2Vzc2lvbjogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cHJvY2Vzc0VjbShjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVjbSkgewotICAgIEFMT0dWKCJwcm9jZXNzRWNtOiBzZXNzaW9uSWQ9JXMiLAotICAgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnByb2Nlc3NFY20oc2Vzc2lvbklkLCBlY20pKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnByb2Nlc3NFbW0oY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVtbSkgewotICAgIEFMT0dWKCJwcm9jZXNzRW1tIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnByb2Nlc3NFbW0oZW1tKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpzZW5kRXZlbnQoCi0gICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmZXZlbnREYXRhKSB7Ci0gICAgQUxPR1YoInNlbmRFdmVudCIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmIChldmVudERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5zZW5kRXZlbnQoZXZlbnQsIGFyZywgQ2FzRGF0YSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5zZW5kRXZlbnQoZXZlbnQsIGFyZywgKmV2ZW50RGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnByb3Zpc2lvbihjb25zdCBTdHJpbmcxNiYgcHJvdmlzaW9uU3RyaW5nKSB7Ci0gICAgQUxPR1YoInByb3Zpc2lvbjogcHJvdmlzaW9uU3RyaW5nPSVzIiwgU3RyaW5nOChwcm92aXNpb25TdHJpbmcpLnN0cmluZygpKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+cHJvdmlzaW9uKFN0cmluZzgocHJvdmlzaW9uU3RyaW5nKSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cmVmcmVzaEVudGl0bGVtZW50cygKLSAgICAgICAgaW50MzJfdCByZWZyZXNoVHlwZSwgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gJnJlZnJlc2hEYXRhKSB7Ci0gICAgQUxPR1YoInJlZnJlc2hFbnRpdGxlbWVudHMiKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAocmVmcmVzaERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5yZWZyZXNoRW50aXRsZW1lbnRzKHJlZnJlc2hUeXBlLCBDYXNEYXRhKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnJlZnJlc2hFbnRpdGxlbWVudHMocmVmcmVzaFR5cGUsICpyZWZyZXNoRGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnJlbGVhc2UoKSB7Ci0gICAgQUxPR1YoInJlbGVhc2U6IHBsdWdpbj0lcCIsCi0gICAgICAgICAgICBtUGx1Z2luSG9sZGVyID09IE5VTEwgPyBtUGx1Z2luSG9sZGVyLT5nZXQoKSA6IE5VTEwpOwotICAgIG1QbHVnaW5Ib2xkZXIuY2xlYXIoKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9EZXNjcmFtYmxlckltcGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTA5ZTIuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRGVzY3JhbWJsZXJJbXBsIgotCi0jaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGVzY3JhbWJsZXJJbXBsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIFN0YXR1cyBnZXRCaW5kZXJTdGF0dXMoc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLSAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQpOwotICAgIH0KLSAgICBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9TVEFURSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihlcnIpOwotfQotCi1zdGF0aWMgU3RyaW5nOCBzZXNzaW9uSWRUb1N0cmluZyhjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vzc2lvbklkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUwMnggIiwgc2Vzc2lvbklkW2ldKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiKG51bGwpIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLURlc2NyYW1ibGVySW1wbDo6RGVzY3JhbWJsZXJJbXBsKAotICAgICAgICBjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgRGVzY3JhbWJsZXJQbHVnaW4gKnBsdWdpbikgOgotICAgICAgICBtTGlicmFyeShsaWJyYXJ5KSwgbVBsdWdpbihwbHVnaW4pIHsKLSAgICBBTE9HVigiQ1RPUjogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotfQotCi1EZXNjcmFtYmxlckltcGw6On5EZXNjcmFtYmxlckltcGwoKSB7Ci0gICAgQUxPR1YoIkRUT1I6IG1QbHVnaW49JXAiLCBtUGx1Z2luKTsKLSAgICByZWxlYXNlKCk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OnNldE1lZGlhQ2FzU2Vzc2lvbihjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCkgewotICAgIEFMT0dWKCJzZXRNZWRpYUNhc1Nlc3Npb246IHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMobVBsdWdpbi0+c2V0TWVkaWFDYXNTZXNzaW9uKHNlc3Npb25JZCkpOwotfQotCi1TdGF0dXMgRGVzY3JhbWJsZXJJbXBsOjpyZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBtaW1lLCBib29sICpyZXN1bHQpIHsKLSAgICAqcmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KFN0cmluZzgobWltZSkpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhPSyk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OmRlc2NyYW1ibGUoCi0gICAgICAgIGNvbnN0IERlc2NyYW1ibGVJbmZvJiBpbmZvLCBpbnQzMl90ICpyZXN1bHQpIHsKLSAgICBBTE9HVigiZGVzY3JhbWJsZSIpOwotCi0gICAgKnJlc3VsdCA9IG1QbHVnaW4tPmRlc2NyYW1ibGUoCi0gICAgICAgICAgICBpbmZvLmRzdFR5cGUgIT0gRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIsCi0gICAgICAgICAgICBpbmZvLnNjcmFtYmxpbmdDb250cm9sLAotICAgICAgICAgICAgaW5mby5udW1TdWJTYW1wbGVzLAotICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzLAotICAgICAgICAgICAgaW5mby5zcmNNZW0tPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIGluZm8uc3JjT2Zmc2V0LAotICAgICAgICAgICAgaW5mby5kc3RUeXBlID09IERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyID8KLSAgICAgICAgICAgICAgICAgICAgaW5mby5zcmNNZW0tPnBvaW50ZXIoKSA6IGluZm8uZHN0UHRyLAotICAgICAgICAgICAgaW5mby5kc3RPZmZzZXQsCi0gICAgICAgICAgICBOVUxMKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoKnJlc3VsdCA+PSAwID8gT0sgOiAqcmVzdWx0KTsKLX0KLQotU3RhdHVzIERlc2NyYW1ibGVySW1wbDo6cmVsZWFzZSgpIHsKLSAgICBBTE9HVigicmVsZWFzZTogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotCi0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVBsdWdpbjsKLSAgICAgICAgbVBsdWdpbiA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vTWVkaWFDYXNEZWZzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyYmEzOC4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vTWVkaWFDYXNEZWZzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDYXMiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUNhc0RlZnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1uYW1lc3BhY2UgTWVkaWFDYXMgewotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzRGF0YTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICByZXR1cm4gcGFyY2VsLT5yZWFkQnl0ZVZlY3Rvcih0aGlzKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc0RhdGE6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0ICB7Ci0gICAgcmV0dXJuIHBhcmNlbC0+d3JpdGVCeXRlVmVjdG9yKCp0aGlzKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcjo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiAvKnBhcmNlbCovKSB7Ci0gICAgQUxPR0UoIkNBUGx1Z2luRGVzY3JpcHRvcjo6cmVhZEZyb21QYXJjZWwoKSBzaG91bGRuJ3QgYmUgY2FsbGVkIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtQ0FTeXN0ZW1JZCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICByZXR1cm4gcGFyY2VsLT53cml0ZVN0cmluZzE2KG1OYW1lKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgTWVkaWFDYXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIgewotCi1EZXNjcmFtYmxlSW5mbzo6RGVzY3JhbWJsZUluZm8oKSB7fQotCi1EZXNjcmFtYmxlSW5mbzo6fkRlc2NyYW1ibGVJbmZvKCkge30KLQotc3RhdHVzX3QgRGVzY3JhbWJsZUluZm86OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoKGludDMyX3QqKSZkc3RUeXBlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGlmIChkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUKLSAgICAgICAgICAgICYmIGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+cmVhZEludDMyKChpbnQzMl90Kikmc2NyYW1ibGluZ0NvbnRyb2wpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRVaW50MzIoKHVpbnQzMl90KikmbnVtU3ViU2FtcGxlcyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAobnVtU3ViU2FtcGxlcyA+IDB4ZmZmZikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN1YlNhbXBsZXMgPSBuZXcgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZVtudW1TdWJTYW1wbGVzXTsKLSAgICBpZiAoc3ViU2FtcGxlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCZzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwYXJjZWwtPnJlYWRVaW50MzIoJnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNyY01lbSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICBpZiAoc3JjTWVtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc3JjT2Zmc2V0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbmF0aXZlX2hhbmRsZV90ICpuYXRpdmVIYW5kbGUgPSBOVUxMOwotICAgIGlmIChkc3RUeXBlID09IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgbmF0aXZlSGFuZGxlID0gcGFyY2VsLT5yZWFkTmF0aXZlSGFuZGxlKCk7Ci0gICAgICAgIGRzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4obmF0aXZlSGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBkc3RQdHIgPSBOVUxMOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZkc3RPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERlc2NyYW1ibGVJbmZvOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgaWYgKGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZQotICAgICAgICAgICAgJiYgZHN0VHlwZSAhPSBrRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KWRzdFR5cGUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIoc2NyYW1ibGluZ0NvbnRyb2wpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKG51bVN1YlNhbXBsZXMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgewotICAgICAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBhcmNlbC0+d3JpdGVVaW50MzIoc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzcmNNZW0pKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKHNyY09mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChkc3RUeXBlID09IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgcGFyY2VsLT53cml0ZU5hdGl2ZUhhbmRsZShzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oZHN0UHRyKSk7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKGRzdE9mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgTWVkaWFEZXNjcmFtYmxlcgotCi19IC8vIG5hbWVzcGFjZSBtZWRpYQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ2NTkzLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElDYXMgewotICAgIHZvaWQgc2V0UHJpdmF0ZURhdGEoaW4gYnl0ZVtdIHB2dERhdGEpOwotICAgIGJ5dGVbXSBvcGVuU2Vzc2lvbigpOwotICAgIHZvaWQgY2xvc2VTZXNzaW9uKGluIGJ5dGVbXSBzZXNzaW9uSWQpOwotICAgIHZvaWQgc2V0U2Vzc2lvblByaXZhdGVEYXRhKGluIGJ5dGVbXSBzZXNzaW9uSWQsIGluIGJ5dGVbXSBwdnREYXRhKTsKLSAgICB2b2lkIHByb2Nlc3NFY20oaW4gYnl0ZVtdIHNlc3Npb25JZCwgaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZWNtKTsKLSAgICB2b2lkIHByb2Nlc3NFbW0oaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZW1tKTsKLSAgICB2b2lkIHNlbmRFdmVudChpbnQgZXZlbnQsIGludCBhcmcsIGluIEBudWxsYWJsZSBieXRlW10gZXZlbnREYXRhKTsKLSAgICB2b2lkIHByb3Zpc2lvbihTdHJpbmcgcHJvdmlzaW9uU3RyaW5nKTsKLSAgICB2b2lkIHJlZnJlc2hFbnRpdGxlbWVudHMoaW50IHJlZnJlc2hUeXBlLCBpbiBAbnVsbGFibGUgYnl0ZVtdIHJlZnJlc2hEYXRhKTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhNWFiYy4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSUNhc0xpc3RlbmVyIHsKLSAgICB2b2lkIG9uRXZlbnQoaW50IGV2ZW50LCBpbnQgYXJnLCBpbiBAbnVsbGFibGUgYnl0ZVtdIGRhdGEpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwgYi9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY5OWViLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURlc2NyYW1ibGVyOwotCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJRGVzY3JhbWJsZXIgewotICAgIHZvaWQgc2V0TWVkaWFDYXNTZXNzaW9uKGluIGJ5dGVbXSBzZXNzaW9uSWQpOwotICAgIGJvb2xlYW4gcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KFN0cmluZyBtaW1lKTsKLSAgICBpbnQgZGVzY3JhbWJsZShpbiBNZWRpYURlc2NyYW1ibGVyLkRlc2NyYW1ibGVJbmZvIGRlc2NyYW1ibGVJbmZvKTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUNhc1NlcnZpY2UuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY2ODI1Li4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuSURlc2NyYW1ibGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuSUNhczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLklDYXNMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ2FzOwotCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJTWVkaWFDYXNTZXJ2aWNlIHsKLSAgICBNZWRpYUNhcy5QYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcltdIGVudW1lcmF0ZVBsdWdpbnMoKTsKLSAgICBib29sZWFuIGlzU3lzdGVtSWRTdXBwb3J0ZWQoaW50IENBX3N5c3RlbV9pZCk7Ci0gICAgSUNhcyBjcmVhdGVQbHVnaW4oaW50IENBX3N5c3RlbV9pZCwgSUNhc0xpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICBib29sZWFuIGlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQoaW50IENBX3N5c3RlbV9pZCk7Ci0gICAgSURlc2NyYW1ibGVyIGNyZWF0ZURlc2NyYW1ibGVyKGludCBDQV9zeXN0ZW1faWQpOwotfQotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwgYi9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGQwYzYuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYUNhcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1wYXJjZWxhYmxlIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yIGNwcF9oZWFkZXIgIm1lZGlhL01lZGlhQ2FzRGVmcy5oIjsKLQotLyoqIEBoaWRlICovCi1wYXJjZWxhYmxlIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNEYXRhIGNwcF9oZWFkZXIgIm1lZGlhL01lZGlhQ2FzRGVmcy5oIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JhbWJsZXIuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmFtYmxlci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg5MjQ0Li4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmFtYmxlci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1wYXJjZWxhYmxlIE1lZGlhRGVzY3JhbWJsZXIuRGVzY3JhbWJsZUluZm8gY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCmluZGV4IDhmZDg2NmMuLjRiMTM5YTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tawpAQCAtMjgsOCArMjgsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGliY2xlYXJrZXljYXNwbHVnaW4KIAotI1RPRE86IG1vdmUgdGhpcyBiYWNrIHRvIC92ZW5kb3IvbGliIGFmdGVyIGNvbnZlcnNpb24gdG8gdHJlYmxlCi0jTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWNhcwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKQEAgLTM5LDYgKzM4LDkgQEAKICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICBsaWJwcm90b2J1Zi1jcHAtbGl0ZSBcCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIG1lZGlhX3BsdWdpbl9oZWFkZXJzCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmpzbW4gXAogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKaW5kZXggNGVkNWZjZS4uZTI3NjMxZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KIAogICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uSWQpOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICBzcDxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPQogICAgICAgICAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUtleUZldGNoZXJMb2NrKTsKQEAgLTI5Myw3ICsyOTMsNyBAQAogc3RhdHVzX3QgQ2xlYXJLZXlDYXNTZXNzaW9uOjp1cGRhdGVFQ00oCiAgICAgICAgIEtleUZldGNoZXIgKmtleUZldGNoZXIsIHZvaWQgKmVjbSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAoa2V5RmV0Y2hlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PVF9QUk9WSVNJT05FRDsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA8IGtFY21IZWFkZXJMZW5ndGgpIHsKQEAgLTM0NCw3ICszNDQsNyBAQAogICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgY29uc3QgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKICAgICAgICAgY29uc3Qgdm9pZCAqc3JjUHRyLCB2b2lkICpkc3RQdHIsIEFTdHJpbmcgKiAvKiBlcnJvckRldGFpbE1zZyAqLykgewogICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0NBTk5PVF9IQU5ETEU7CiAgICAgfQogCiAgICAgQUVTX0tFWSBjb250ZW50S2V5OwpAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgICAgIGludDMyX3Qga2V5SW5kZXggPSAoc2NyYW1ibGluZ0NvbnRyb2wgJiAxKTsKICAgICAgICAgaWYgKCFtS2V5SW5mb1trZXlJbmRleF0udmFsaWQpIHsKICAgICAgICAgICAgIEFMT0dFKCJkZWNyeXB0OiBrZXkgJWQgaXMgaW52YWxpZCIsIGtleUluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVDUllQVDsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9DQVNfREVDUllQVDsKICAgICAgICAgfQogICAgICAgICBjb250ZW50S2V5ID0gbUtleUluZm9ba2V5SW5kZXhdLmNvbnRlbnRLZXk7CiAgICAgfQpAQCAtNDIwLDcgKzQyMCw3IEBACiAKICAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJDbGVhcktleURlc2NyYW1ibGVyUGx1Z2luOiBzZXNzaW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgbUNBU1Nlc3Npb24gPSBzZXNzaW9uOwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKICAgICBpZiAobUNBU1Nlc3Npb24gPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5pbml0aWFsaXplZCBDQVMgc2Vzc2lvbiEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQ7CiAgICAgfQogCiAgICAgcmV0dXJuIG1DQVNTZXNzaW9uLT5kZWNyeXB0KApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKaW5kZXggOWNkNzdlOS4uNmUxMDA0YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCkBAIC00OCwyNCArNDgsMjQgQEAKICAqIEV4dHJhY3QgYSBjbGVhciBrZXkgYXNzZXQgZnJvbSBhIEpTT04gc3RyaW5nLgogICoKICAqIFJldHVybnMgT0sgaWYgYSBjbGVhciBrZXkgYXNzZXQgaXMgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSwKLSAqIG9yIEVSUk9SX0RSTV9OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKKyAqIG9yIEVSUk9SX0NBU19OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKICAqIGNsZWFyIGtleSBhc3NldC4KICAqLwogc3RhdHVzX3QgSnNvbkFzc2V0TG9hZGVyOjpleHRyYWN0QXNzZXRGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBTdHJpbmc4JiBqc29uQXNzZXRTdHJpbmcsIEFzc2V0ICphc3NldCkgewogICAgIGlmICghcGFyc2VKc29uQXNzZXRTdHJpbmcoanNvbkFzc2V0U3RyaW5nLCAmbUpzb25PYmplY3RzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfTk9fTElDRU5TRTsKICAgICB9CiAKICAgICBpZiAobUpzb25PYmplY3RzLnNpemUoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PX0xJQ0VOU0U7CiAgICAgfQogCiAgICAgaWYgKCFwYXJzZUpzb25PYmplY3QobUpzb25PYmplY3RzWzBdLCAmbVRva2VucykpCi0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogCiAgICAgaWYgKCFmaW5kS2V5KG1Kc29uT2JqZWN0c1swXSwgYXNzZXQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmgKaW5kZXggMmVmMDZjNC4uNWZiZGVhNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuaApAQCAtMjksNyArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNsZWFya2V5Y2FzIHsKIGVudW0gewotICAgIENMRUFSS0VZX1NUQVRVU19CQVNFID0gRVJST1JfRFJNX1ZFTkRPUl9NQVgsCisgICAgQ0xFQVJLRVlfU1RBVFVTX0JBU0UgPSBFUlJPUl9DQVNfVkVORE9SX01BWCwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJREFTU0VUSUQgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDEsCiAgICAgQ0xFQVJLRVlfU1RBVFVTX0lOVkFMSURTWVNURU1JRCA9IENMRUFSS0VZX1NUQVRVU19CQVNFIC0gMiwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDMsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawppbmRleCBjYmY3YmU3Li41NDE4YzFkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTI2LDcgKzI2LDcgQEAKICMgdGhlIHBsdWdpbiBpcyBub3QgaW4gc3RhbmRhcmQgbGlicmFyeSBzZWFyY2ggcGF0aC4gV2l0aG91dCB0aGlzIC5zbwogIyBsb2FkaW5nIGZhaWxzIGF0IHJ1bi10aW1lIChsaW5raW5nIGlzIG9rYXkpLgogTE9DQUxfTERGTEFHUyA6PSBcCi0gICAgLVdsLC0tcnBhdGgsXCQke09SSUdJTn0vLi4vLi4vLi4vc3lzdGVtL2xpYi9tZWRpYWNhcyAtV2wsLS1lbmFibGUtbmV3LWR0YWdzCisgICAgLVdsLC0tcnBhdGgsXCQke09SSUdJTn0vLi4vLi4vLi4vc3lzdGVtL3ZlbmRvci9saWIvbWVkaWFjYXMgLVdsLC0tZW5hYmxlLW5ldy1kdGFncwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJ1dGlscyBsaWJjbGVhcmtleWNhc3BsdWdpbiBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnByb3RvYnVmLWNwcC1saXRlIGxpYmxvZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCmluZGV4IDUwZTEyZjQuLjc3MWYxYjggMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCmluZGV4IDMwOWMyM2QuLmNlMzBhNzggMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9DYXNJbXBsLmggYi9pbmNsdWRlL21lZGlhL0Nhc0ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2ZjFjZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0Nhc0ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENBU19JTVBMX0hfCi0jZGVmaW5lIENBU19JTVBMX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkNhcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhc0xpc3RlbmVyOwotfQotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwotdXNpbmcgbmFtZXNwYWNlIE1lZGlhQ2FzOwotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgQ2FzUGx1Z2luOwotY2xhc3MgU2hhcmVkTGlicmFyeTsKLQotY2xhc3MgQ2FzSW1wbCA6IHB1YmxpYyBCbkNhcyB7Ci1wdWJsaWM6Ci0gICAgQ2FzSW1wbChjb25zdCBzcDxJQ2FzTGlzdGVuZXI+ICZsaXN0ZW5lcik7Ci0gICAgdmlydHVhbCB+Q2FzSW1wbCgpOwotCi0gICAgc3RhdGljIHZvaWQgT25FdmVudCgKLSAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCi0gICAgICAgICAgICBpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgaW50MzJfdCBhcmcsCi0gICAgICAgICAgICB1aW50OF90ICpkYXRhLAotICAgICAgICAgICAgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBpbml0KGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBDYXNQbHVnaW4gKnBsdWdpbik7Ci0gICAgdm9pZCBvbkV2ZW50KAotICAgICAgICAgICAgaW50MzJfdCBldmVudCwKLSAgICAgICAgICAgIGludDMyX3QgYXJnLAotICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKLSAgICAgICAgICAgIHNpemVfdCBzaXplKTsKLQotICAgIC8vIElDYXMgaW5oZXJpdHMKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNldFByaXZhdGVEYXRhKAotICAgICAgICAgICAgY29uc3QgQ2FzRGF0YSYgcHZ0RGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBvcGVuU2Vzc2lvbihDYXNTZXNzaW9uSWQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBjbG9zZVNlc3Npb24oY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2V0U2Vzc2lvblByaXZhdGVEYXRhKAotICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBDYXNEYXRhJiBwdnREYXRhKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHByb2Nlc3NFY20oCi0gICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCwgY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVjbSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBwcm9jZXNzRW1tKGNvbnN0IFBhcmNlbGFibGVDYXNEYXRhJiBlbW0pIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2VuZEV2ZW50KAotICAgICAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+ICZldmVudERhdGEpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzE2JiBwcm92aXNpb25TdHJpbmcpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcmVmcmVzaEVudGl0bGVtZW50cygKLSAgICAgICAgICAgIGludDMyX3QgcmVmcmVzaFR5cGUsIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+ICZyZWZyZXNoRGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyByZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IFBsdWdpbkhvbGRlcjsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IG1QbHVnaW5Ib2xkZXI7Ci0gICAgc3A8SUNhc0xpc3RlbmVyPiBtTGlzdGVuZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYXNJbXBsKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIENBU19JTVBMX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0Rlc2NyYW1ibGVySW1wbC5oIGIvaW5jbHVkZS9tZWRpYS9EZXNjcmFtYmxlckltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyMTJhYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0Rlc2NyYW1ibGVySW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgREVTQ1JBTUJMRVJfSU1QTF9IXwotI2RlZmluZSBERVNDUkFNQkxFUl9JTVBMX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkRlc2NyYW1ibGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYURlc2NyYW1ibGVyOwotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgRGVzY3JhbWJsZXJQbHVnaW47Ci1jbGFzcyBTaGFyZWRMaWJyYXJ5OwotCi1jbGFzcyBEZXNjcmFtYmxlckltcGwgOiBwdWJsaWMgQm5EZXNjcmFtYmxlciB7Ci1wdWJsaWM6Ci0gICAgRGVzY3JhbWJsZXJJbXBsKGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luKTsKLSAgICB2aXJ0dWFsIH5EZXNjcmFtYmxlckltcGwoKTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNldE1lZGlhQ2FzU2Vzc2lvbigKLSAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudCgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBtaW1lLCBib29sICpyZXN1bHQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgZGVzY3JhbWJsZSgKLSAgICAgICAgICAgIGNvbnN0IERlc2NyYW1ibGVJbmZvJiBkZXNjcmFtYmxlSW5mbywgaW50MzJfdCAqcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlbGVhc2UoKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBEZXNjcmFtYmxlclBsdWdpbiAqbVBsdWdpbjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyYW1ibGVySW1wbCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBERVNDUkFNQkxFUl9JTVBMX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhQ2FzRGVmcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNhc0RlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1YTk2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhQ2FzRGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ0FTX0RFRlNfSF8KLSNkZWZpbmUgTUVESUFfQ0FTX0RFRlNfSF8KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvQ2FzQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1jbGFzcyBJTWVtb3J5OwotbmFtZXNwYWNlIG1lZGlhIHsKLQotbmFtZXNwYWNlIE1lZGlhQ2FzIHsKLWNsYXNzIFBhcmNlbGFibGVDYXNEYXRhIDogcHVibGljIENhc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQYXJjZWxhYmxlIHsKLXB1YmxpYzoKLSAgICBQYXJjZWxhYmxlQ2FzRGF0YSgpIHt9Ci0gICAgUGFyY2VsYWJsZUNhc0RhdGEoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIDoKLSAgICAgICAgQ2FzRGF0YShkYXRhLCBkYXRhICsgc2l6ZSkge30KLSAgICB2aXJ0dWFsIH5QYXJjZWxhYmxlQ2FzRGF0YSgpIHt9Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcmNlbGFibGVDYXNEYXRhKTsKLX07Ci0KLWNsYXNzIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yIDogcHVibGljIFBhcmNlbGFibGUgewotcHVibGljOgotICAgIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBjb25zdCBjaGFyICpuYW1lKQotICAgICAgICA6IG1DQVN5c3RlbUlkKENBX3N5c3RlbV9pZCksIG1OYW1lKG5hbWUpIHt9Ci0KLSAgICBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcigpIDogbUNBU3lzdGVtSWQoMCkge30KLQotICAgIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yJiYgZGVzYykgPSBkZWZhdWx0OwotCi0gICAgdmlydHVhbCB+UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoKSB7fQotCi0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIGludDMyX3QgbUNBU3lzdGVtSWQ7Ci0gICAgU3RyaW5nMTYgbU5hbWU7Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IpOwotfTsKLX0KLQotbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIgewotY2xhc3MgRGVzY3JhbWJsZUluZm8gOiBwdWJsaWMgUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSBEZXN0aW5hdGlvblR5cGUgewotICAgICAgICBrRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyLCAgICAvLyBub24tc2VjdXJlCi0gICAgICAgIGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUgIC8vIHNlY3VyZQotICAgIH07Ci0KLSAgICBEZXN0aW5hdGlvblR5cGUgZHN0VHlwZTsKLSAgICBEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wgc2NyYW1ibGluZ0NvbnRyb2w7Ci0gICAgc2l6ZV90IG51bVN1YlNhbXBsZXM7Ci0gICAgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlczsKLSAgICBzcDxJTWVtb3J5PiBzcmNNZW07Ci0gICAgaW50MzJfdCBzcmNPZmZzZXQ7Ci0gICAgdm9pZCAqZHN0UHRyOwotICAgIGludDMyX3QgZHN0T2Zmc2V0OwotCi0gICAgRGVzY3JhbWJsZUluZm8oKTsKLSAgICB2aXJ0dWFsIH5EZXNjcmFtYmxlSW5mbygpOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotcHJpdmF0ZToKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyYW1ibGVJbmZvKTsKLX07Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIG1lZGlhCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vIE1FRElBX0NBU19ERUZTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsIGIvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbAppbmRleCAzN2UyYzM5Li5mNDAwNTgyIDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsCisrKyBiL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8gYi9pbmNsdWRlL21lZGlhL25iYWlvCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA2N2QwYmE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41NTg0MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY1YmNjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQzYmZhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOGExM2I2YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI3NTBmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40ZWE0M2JlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjMwZjQyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmY2YTE1MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jMzU0MDFlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uN2FjZmM5MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hNGJiYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY0YjIxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzRhM2IwNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggOWRhNWVmMy4uZmY0NDBiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC01NjgsNiArNTY4LDkgQEAKICAgICAvLyB3aGljaCBtYXkgaW5jbHVkZSBub24tY29udGlndW91cyBmcmFtZXMKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5KCk7CiAKKyAgICAvLyBTYWZlIGZyYW1lcyByZWFkeSBxdWVyeSB1c2VkIGJ5IGR1bXAoKSAtIHRoaXMgaGFzIG5vIHNpZGUgZWZmZWN0cy4KKyAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0OworCiAgICAgLy8gQ3VycmVudGx5IEF1ZGlvRmxpbmdlciB3aWxsIGNhbGwgZnJhbWVzUmVhZHkoKSBmb3IgYSBmYXN0IHRyYWNrIGZyb20gdHdvIHRocmVhZHM6CiAgICAgLy8gRmFzdE1peGVyIHRocmVhZCwgYW5kIG5vcm1hbCBtaXhlciB0aHJlYWQuICBUaGlzIGlzIGRhbmdlcm91cywgYXMgdGhlIHByb3h5IGlzIGludGVuZGVkCiAgICAgLy8gdG8gYmUgY2FsbGVkIGZyb20gYXQgbW9zdCBvbmUgdGhyZWFkIG9mIHNlcnZlciwgYW5kIG9uZSB0aHJlYWQgb2YgY2xpZW50LgpAQCAtNjIwLDYgKzYyMyw3IEBACiAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5KCk7CisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGZyYW1lc1JlYWR5SXNDYWxsZWRCeU11bHRpcGxlVGhyZWFkcygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBib29sIGFja0ZsdXNoKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW8uaCBiL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzdmOGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yYWRpby9JUmFkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVJhZGlvIDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLQotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmFkaW8pOwotCi0gICAgdmlydHVhbCB2b2lkIGRldGFjaCgpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWwoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblJhZGlvOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVJhZGlvPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW9DbGllbnQuaCBiL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNjJhZDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yYWRpby9JUmFkaW9DbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0NMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0NMSUVOVF9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJUmFkaW9DbGllbnQgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShSYWRpb0NsaWVudCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpID0gMDsKLQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblJhZGlvQ2xpZW50IDogcHVibGljIEJuSW50ZXJmYWNlPElSYWRpb0NsaWVudD4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaCBiL2luY2x1ZGUvcmFkaW8vSVJhZGlvU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTQ2ZGQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElSYWRpbzsKLWNsYXNzIElSYWRpb0NsaWVudDsKLQotY2xhc3MgSVJhZGlvU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0KLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJhZGlvU2VydmljZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpb1NlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW9TZXJ2aWNlPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fU0VSVklDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL1JhZGlvLmggYi9pbmNsdWRlL3JhZGlvL1JhZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGRkMmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yYWRpby9SYWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSAotCi0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8cmFkaW8vUmFkaW9DYWxsYmFjay5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZW1vcnlEZWFsZXI7Ci0KLWNsYXNzIFJhZGlvIDogcHVibGljIEJuUmFkaW9DbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLXsKLXB1YmxpYzoKLQotICAgIHZpcnR1YWwgflJhZGlvKCk7Ci0KLSAgICBzdGF0aWMgIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOwotICAgIHN0YXRpYyAgc3A8UmFkaW8+IGF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mIGNhbGxiYWNrKTsKLQotCi0gICAgICAgICAgICB2b2lkIGRldGFjaCgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgY2FuY2VsKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKTsKLQotICAgICAgICAgICAgLy8gQnBSYWRpb0NsaWVudAotICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KTsKLQotICAgICAgICAgICAgLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAotICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICBSYWRpbyhyYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mKTsKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiBnZXRSYWRpb1NlcnZpY2UoKTsKLQotICAgICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgICAgICAgICBzcDxJUmFkaW8+ICAgICAgICAgICAgICBtSVJhZGlvOwotICAgICAgICAgICAgc3A8UmFkaW9DYWxsYmFjaz4gICAgICAgbUNhbGxiYWNrOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9SQURJT19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaCBiL2luY2x1ZGUvcmFkaW8vUmFkaW9DYWxsYmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTdmMWE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vUmFkaW9DYWxsYmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19DQUxMQkFDS19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFJhZGlvQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotCi0gICAgICAgICAgICBSYWRpb0NhbGxiYWNrKCkge30KLSAgICB2aXJ0dWFsIH5SYWRpb0NhbGxiYWNrKCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KHN0cnVjdCByYWRpb19ldmVudCAqZXZlbnQpID0gMDsKLQotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9SQURJT19DQUxMQkFDS19ICmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawppbmRleCBhZmQxMTg5Li4zZWU3NDk0IDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKQEAgLTE0LDcgKzE0LDYgQEAKIAlsaWJsb2cgXAogCWxpYm1lZGlhbG9nc2VydmljZSBcCiAJbGlibmJhaW8gXAotCWxpYnJhZGlvc2VydmljZSBcCiAJbGlic291bmR0cmlnZ2Vyc2VydmljZSBcCiAJbGlidXRpbHMgXAogCWxpYmh3YmluZGVyCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcCBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCmluZGV4IGVlMDJkMjMuLjM0YzYyOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgotI2luY2x1ZGUgIlJhZGlvU2VydmljZS5oIgogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTEzMyw3ICsxMzIsNiBAQAogICAgICAgICBBdWRpb0ZsaW5nZXI6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQUF1ZGlvU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICAgICAgUmFkaW9TZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAppbmRleCBmNTM5YmE5Li42ZTYwZjI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icApAQCAtMTYsMTIgKzE2LDE0IEBACiAgICAgbmFtZTogImxpYkFBdWRpb19oZWFkZXJzIiwKICAgICBmcm9tOiAiaW5jbHVkZSIsCiAgICAgdG86ICIiLAotICAgIHNyY3M6IFsiaW5jbHVkZS9hYXVkaW8vKi5oIl0sCisgICAgLy8gb21pdCBBQXVkaW9UZXN0aW5nLmg7IHN1cHBsaWVkIHNlcGFyYXRlbHkgdG8gdGhvc2Ugd2hvIG5lZWQgaXQKKyAgICBzcmNzOiBbImluY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIl0sCiAgICAgbGljZW5zZTogImluY2x1ZGUvYWF1ZGlvL05PVElDRSIsCiB9CiAKIG5ka19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYWF1ZGlvIiwKKyAgICAvLyBkZWxpYmVyYXRlbHkgaW5jbHVkZXMgc3ltYm9scyBmcm9tIEFBdWRpb1Rlc3RpbmcuaAogICAgIHN5bWJvbF9maWxlOiAibGliYWF1ZGlvLm1hcC50eHQiLAogICAgIGZpcnN0X3ZlcnNpb246ICIyNiIsCiAgICAgdW52ZXJzaW9uZWRfdW50aWw6ICJjdXJyZW50IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcAppbmRleCBmMTU5M2ZlLi4xMzM4Yjg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCkBAIC04Niw3ICs4Niw3IEBACiAgICAgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoYWF1ZGlvU3RyZWFtKTsKICAgICBwcmludGYoImRldmljZUlkID0gJWRcbiIsIGRldmljZUlkKTsKIAotICAgIGFjdHVhbFNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoYWF1ZGlvU3RyZWFtKTsKKyAgICBhY3R1YWxTYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KGFhdWRpb1N0cmVhbSk7CiAgICAgcHJpbnRmKCJTYW1wbGVzUGVyRnJhbWUgPSAlZFxuIiwgYWN0dWFsU2FtcGxlc1BlckZyYW1lKTsKICAgICBhY3R1YWxTYW1wbGVSYXRlID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUoYWF1ZGlvU3RyZWFtKTsKICAgICBwcmludGYoIlNhbXBsZXNQZXJGcmFtZSA9ICVkXG4iLCBhY3R1YWxTYW1wbGVSYXRlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKaW5kZXggOWU3YzQ2My4uYjI2YjJlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKQEAgLTY4LDcgKzY4LDcgQEAKICAgICAgICAgaWYgKG1TdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW0pOzsKKyAgICAgICAgcmV0dXJuIEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQobVN0cmVhbSk7OwogICAgIH0KICAgICAvKioKICAgICAgKiBPbmx5IGNhbGwgdGhpcyBhZnRlciBvcGVuKCkgaGFzIGJlZW4gY2FsbGVkLgpAQCAtMTQwLDcgKzE0MCw3IEBACiAKICAgICAvLyBXcml0ZSB6ZXJvIGRhdGEgdG8gZmlsbCB1cCB0aGUgYnVmZmVyIGFuZCBwcmV2ZW50IHVuZGVycnVucy4KICAgICBhYXVkaW9fcmVzdWx0X3QgcHJpbWUoKSB7Ci0gICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShtU3RyZWFtKTsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1TdHJlYW0pOwogICAgICAgICBjb25zdCBpbnQgbnVtRnJhbWVzID0gMzI7IC8vIGFyYml0cmFyeQogICAgICAgICBmbG9hdCB6ZXJvc1tudW1GcmFtZXMgKiBzYW1wbGVzUGVyRnJhbWVdOwogICAgICAgICBtZW1zZXQoemVyb3MsIDAsIHNpemVvZih6ZXJvcykpOwpAQCAtMjE0LDcgKzIxNCw3IEBACiAgICAgfQogICAgIFBlYWtUcmFja2VyRGF0YV90ICpkYXRhID0gKFBlYWtUcmFja2VyRGF0YV90ICopIHVzZXJEYXRhOwogICAgIC8vIHByaW50ZigiTXlDYWxsYmFja1Byb2MoKTogZnJhbWVDb3VudCA9ICVkXG4iLCBudW1GcmFtZXMpOwotICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShzdHJlYW0pOworICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChzdHJlYW0pOwogICAgIGZsb2F0IHNhbXBsZTsKICAgICAvLyBUaGlzIGNvZGUgYXNzdW1lIG1vbm8gb3Igc3RlcmVvLgogICAgIHN3aXRjaCAoQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChzdHJlYW0pKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmggYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKaW5kZXggZTE4ODZhYy4uZTVmMGRlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaApAQCAtMjM0LDE0ICsyMzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpOwogCiAvKioKLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoKQotICovCi0vLyBUT0RPIHJlbW92ZSBhcyBzb29uIGFzIHRoZSBOREsgYW5kIE9TIGFyZSBpbiBzeW5jLCBiZWZvcmUgUkMxCi1BQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSk7Ci0KLS8qKgogICogUmVxdWVzdCBhIHNhbXBsZSBkYXRhIGZvcm1hdCwgZm9yIGV4YW1wbGUgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LgogICoKICAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1VOU1BFQ0lGSUVELgpAQCAtNzI5LDE1ICs3MjEsNiBAQAogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOwogCiAvKioKLSAqIFRoZSBzYW1wbGVzUGVyRnJhbWUgaXMgYWxzbyBrbm93biBhcyBjaGFubmVsQ291bnQuCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoKQotICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gYWN0dWFsIHNhbXBsZXMgcGVyIGZyYW1lCi0gKi8KLUFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKLQotLyoqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgZGV2aWNlIElECiAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dCBiL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dAppbmRleCAyYmE1MjUwLi5iOTAxMmU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0CkBAIC0xMSw3ICsxMSw2IEBACiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudDsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdDsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlOwpAQCAtMzUsNyArMzQsNiBAQAogICAgIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzOwogICAgIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQ7CiAgICAgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGU7Ci0gICAgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZTsKICAgICBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50OwogICAgIEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGU7CiAgICAgQUF1ZGlvU3RyZWFtX2dldERldmljZUlkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggM2Y1ZGU3Ny4uY2E0MjQ0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0xNTAsMTMgKzE1MCw2IEBACiAgICAgc3RyZWFtQnVpbGRlci0+c2V0U2FtcGxlc1BlckZyYW1lKGNoYW5uZWxDb3VudCk7CiB9CiAKLUFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQotewotICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpOwotfQotCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCiB7CkBAIC0zNTcsMTIgKzM1MCw2IEBACiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKIH0KIAotQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCi17Ci0gICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmdldFNhbXBsZXNQZXJGcmFtZSgpOwotfQotCiBBQVVESU9fQVBJIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCAyZjcxMGJkLi4yMTFiZDdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC0xMjk3LDcgKzEyOTcsNyBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKQEAgLTEzMDcsNyArMTMwNyw3IEBACiAgICAgfQogCiAgICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgY2IoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IGIwYjAxZGIuLjMxZTFlMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgpAQCAtNjIsMTEgKzYzLDYgQEAKICAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBjb252ZXJ0VGltZXNwZWNUb05zKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpCi17Ci0gICAgcmV0dXJuIHR2LnR2X3NlYyAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCArIHR2LnR2X25zZWM7Ci19Ci0KIC8vIGN1cnJlbnQgbW9ub3RvbmljIHRpbWUgaW4gbWljcm9zZWNvbmRzLgogc3RhdGljIGludDY0X3QgZ2V0Tm93VXMoKQogewpAQCAtMjU2Myw3ICsyNTU5LDcgQEAKICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIHRpbWVzdGFtcCB0aW1lIGV2ZW4gd2hlbiBwYXVzZWQuCiAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQgLyogbm90IG5lZWRlZDogU1RBVEVfUEFVU0VEX1NUT1BQSU5HICovKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZXN0YW1wLm1UaW1lKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWcgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldHMubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPCAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0cy5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxfTEFTVEtFUk5FTE9LXSA8IDApCkBAIC0yNjk1LDggKzI2OTEsOSBAQAogICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIGNhdXNlZCBieSBlcnJhdGljIHJlcG9ydHMgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgQUxTQSBkcml2ZXJzLgogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKHByZXZpb3VzVGltZXN0YW1wVmFsaWQpIHsKLSAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcHJldmlvdXNUaW1lTmFub3MgPSBjb252ZXJ0VGltZXNwZWNUb05zKG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZSk7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBjb252ZXJ0VGltZXNwZWNUb05zKHRpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHByZXZpb3VzVGltZU5hbm9zID0KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVOYW5vcyA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWVzdGFtcC5tVGltZSk7CiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IHByZXZpb3VzVGltZU5hbm9zKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpcHJldmlvdXNUaW1lTmFub3MpOwpAQCAtMjcyNiw3ICsyNzIzLDcgQEAKICNpZiAwCiAgICAgICAgICAgICAvLyBVbmNvbW1lbnQgdGhpcyB0byB2ZXJpZnkgYXVkaW8gdGltZXN0YW1wIHJhdGUuCiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUaW1lc3BlY1RvTnModGltZXN0YW1wLm1UaW1lKSAtIHByZXZpb3VzVGltZU5hbm9zOworICAgICAgICAgICAgICAgICAgICBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lc3RhbXAubVRpbWUpIC0gcHJldmlvdXNUaW1lTmFub3M7CiAgICAgICAgICAgICBpZiAoZGVsdGFUaW1lICE9IDApIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGNvbXB1dGVkU2FtcGxlUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uICogKGxvbmcgbG9uZylOQU5PU19QRVJfU0VDT05EIC8gZGVsdGFUaW1lOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCAyY2U2YzYzLi45N2YwZGZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtODMyLDYgKzgzMiwyNSBAQAogICAgIHJldHVybiBmaWxsZWQ7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorc2l6ZV90IEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6ZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QKK3sKKyAgICBpZiAobUlzU2h1dGRvd24pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvbnN0IGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOworICAgIGNvbnN0IGludDMyX3QgZmx1c2ggPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tRmx1c2gpOworICAgIGlmIChmbHVzaCAhPSBtRmx1c2gpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50OworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CisgICAgICAgIHJldHVybiAwOyAvLyBlcnJvciBjb25kaXRpb24sIHNpbGVudGx5IHJldHVybiAwLgorICAgIH0KKyAgICByZXR1cm4gZmlsbGVkOworfQorCiBib29sICBBdWRpb1RyYWNrU2VydmVyUHJveHk6OnNldFN0cmVhbUVuZERvbmUoKSB7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgYm9vbCBvbGQgPQpAQCAtOTAwLDYgKzkxOSwxMSBAQAogICAgIHJldHVybiBtRnJhbWVzUmVhZHlTYWZlOwogfQogCitzaXplX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpmcmFtZXNSZWFkeVNhZmUoKSBjb25zdAoreworICAgIHJldHVybiBtRnJhbWVzUmVhZHlTYWZlOworfQorCiBzdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnVwZGF0ZVN0YXRlV2l0aExvb3AoCiAgICAgICAgIFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSAqbG9jYWxTdGF0ZSwgY29uc3QgU3RhdGljQXVkaW9UcmFja1N0YXRlICZ1cGRhdGUpIGNvbnN0CiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCmluZGV4IDk4YTA1MjEuLmFkN2YxZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCkBAIC00OCw2ICs0OCwxOCBAQAogICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY29uZmlnLT5mb3JtYXQpOwogfQogCitpbmxpbmUgdm9pZCByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhLCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgeworICAgIGNsaWVudEluZm8tPnVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkVWludDMyKCk7CisgICAgY2xpZW50SW5mby0+c2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgY2xpZW50SW5mby0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworfQorCitpbmxpbmUgdm9pZCB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKFBhcmNlbCYgZGF0YSwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKKyAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgY2xpZW50SW5mby0+dWlkKTsKKyAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNlc3Npb24pOworICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c291cmNlKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogY2xhc3MgQnBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4KIHsKQEAgLTgwLDE0ICs5MiwxMyBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUlYX1NUQVRFX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogCi0gICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNvdXJjZSk7CisgICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgY2xpZW50SW5mbyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgY2xpZW50Q29uZmlnKTsKICAgICAgICAgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChkYXRhLCBkZXZpY2VDb25maWcpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGF0Y2hIYW5kbGUpOwpAQCAtMTIzLDE0ICsxMzQsMTQgQEAKICAgICBjYXNlIFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBldmVudCA9IChpbnQpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBjbGllbnRJbmZvOwogICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjbGllbnRDb25maWc7CiAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZzsKKyAgICAgICAgICAgIHJlYWRSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50SW5mbyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50Q29uZmlnKTsKICAgICAgICAgICAgIHJlYWRBdWRpb0NvbmZpZ0Jhc2VGcm9tUGFyY2VsKGRhdGEsICZkZXZpY2VDb25maWcpOwogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwgJmNsaWVudENvbmZpZywgJmRldmljZUNvbmZpZywKKyAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJmNsaWVudEluZm8sICZjbGllbnRDb25maWcsICZkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIHBhdGNoSGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCAyZTM5ZDIzLi40ZDViMzE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0zMyw3ICszMyw3IEBACiAKIHR5cGVkZWYgdm9pZCAoKmF1ZGlvX2Vycm9yX2NhbGxiYWNrKShzdGF0dXNfdCBlcnIpOwogdHlwZWRlZiB2b2lkICgqZHluYW1pY19wb2xpY3lfY2FsbGJhY2spKGludCBldmVudCwgU3RyaW5nOCByZWdJZCwgaW50IHZhbCk7Ci10eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBpbnQgc291cmNlLAordHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKQEAgLTQ0MCw4ICs0NDAsOSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKIAogICAgIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCmluZGV4IGQ5NGFkMDAuLmUwZDI0OTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0yNiw2ICsyNiwxNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0cnVjdCByZWNvcmRfY2xpZW50X2luZm8geworICAgIHVpZF90IHVpZDsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2U7Cit9OworCit0eXBlZGVmIHN0cnVjdCByZWNvcmRfY2xpZW50X2luZm8gcmVjb3JkX2NsaWVudF9pbmZvX3Q7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiBwdWJsaWM6CkBAIC0zOCw4ICs0OCw4IEBACiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIG1peGluZyBzdGF0ZSBvZiBhIHNwZWNpZmljIG1peCBpbiBhIGR5bmFtaWMgYXVkaW8gcG9saWN5CiAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyByZWNvcmRpbmcgY29uZmlndXJhdGlvbgotICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rCmluZGV4IGU1OTIxNjkuLjgyNzkwOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5tawpAQCAtMyw2ICszLDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3V0aWxzIFwKICAgICBsaWJjdXRpbHMgICBcCiAgICAgbGlibG9nICAgICAgXAogICAgIGxpYnV0aWxzICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAKaW5kZXggNzFmYmQ5OC4uNDllZjk5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAKQEAgLTk4LDcgKzk4LDggQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBEZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSkgeworICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7CiB9CiAKIERldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewpAQCAtMTIwLDI0ICsxMjEsMjEgQEAKIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIHByaW1hcnlEZXYtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBwcmltYXJ5RGV2LT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gcHJpbWFyeURldiA9IElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShtRGV2aWNlKTsKLSAgICBpZiAocHJpbWFyeURldiA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBwcmltYXJ5RGV2LT5nZXRNYXN0ZXJWb2x1bWUoCisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCiAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwogICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewpAQCAtMTQ5LDkgKzE0Nyw4IEBACiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gcHJpbWFyeURldiA9IElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShtRGV2aWNlKTsKLSAgICBpZiAocHJpbWFyeURldiA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBwcmltYXJ5RGV2LT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmgKaW5kZXggOWRhMDJhNC4uODY1MWI1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaApAQCAtMTgsMTEgKzE4LDEzIEBACiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JUHJpbWFyeURldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgogCiAjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVByaW1hcnlEZXZpY2U7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTExMCw2ICsxMTIsNyBAQAogICBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7CiAgICAgc3A8SURldmljZT4gbURldmljZTsKKyAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCiAKICAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAKaW5kZXggNDI3ODVkNS4uMTc2YWJlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAKQEAgLTQ4LDYgKzQ4LDE4IEBACiAgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAogICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7CisKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBBdWRpb0NoYW5uZWxNYXNrIG0sIEF1ZGlvRm9ybWF0IGYpIHsKKyAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7CisgICAgICAgICAgICB9KTsKKyAgICB9CiB9CiAKIFN0cmVhbUhhbEhpZGw6On5TdHJlYW1IYWxIaWRsKCkgewpAQCAtMTM1LDYgKzE0Nyw3IEBACiAgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKIH0KIApAQCAtMzExLDcgKzMyNCw3IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKICAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOwpAQCAtMzIwLDYgKzMzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKICAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKQEAgLTU4MCw3ICs1OTUsNyBAQAogICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKICAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwogICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAorICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCiAgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewogICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwogICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKQEAgLTU5MSw2ICs2MDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYXZhaWxUb1JlYWQsIChpbnQzMl90KXJlYWRTdGF0dXMucmVwbHkucmVhZCk7CiAgICAgICAgICAgICAgICAgKnJlYWQgPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQ7CiAgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKnJlYWQpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Y2FsbFJlYWRlclRocmVhZCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaAppbmRleCBhN2RmMjc2Li5hNjljY2U4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1JbjsKQEAgLTEwMyw2ICsxMDQsOSBAQAogCiAgICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7CiAKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCiAgIHByaXZhdGU6CiAgICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwogICAgIElTdHJlYW0gKm1TdHJlYW07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAKaW5kZXggMDU4MDBhMC4uZGMxN2Y1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcApAQCAtMjcsNyArMjcsMTUgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgeworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOworICAgIH0KIH0KIAogU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKQEAgLTk1LDcgKzEwMyw5IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHJldHVybiBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgewpAQCAtMTMzLDYgKzE0Myw3IEBACiAgICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwogICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgICp3cml0dGVuID0gMDsKQEAgLTI2Niw2ICsyNzcsNyBAQAogICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CiAgICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7CiAgICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewogICAgICAgICAqcmVhZCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaAppbmRleCA4Yzk2YzFmLi5jNzEzNmRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKIAogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODMsNiArODQsOSBAQAogCiAgICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7CiAKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCiAgIHByaXZhdGU6CiAgICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbVBvd2VyTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4YjFhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbVBvd2VyTG9nLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJlYW1Qb3dlckxvZyB7CitwdWJsaWM6CisgICAgU3RyZWFtUG93ZXJMb2coKSA6CisgICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKKyAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAorICAgICAgICBtRnJhbWVTaXplKDApIHsKKyAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KKyAgICB9CisKKyAgICB+U3RyZWFtUG93ZXJMb2coKSB7CisgICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCisgICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKKyAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7CisgICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCisgICAgfQorCisgICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgorICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKKyAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAorICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOworICAgIH0KKworICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgorICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCisgICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAorICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIH0KKworcHJpdmF0ZToKKworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgeworICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAorICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOworICAgIH0KKworICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLworICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOworCisgICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7CisgICAgc2l6ZV90IG1GcmFtZVNpemU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRGV2aWNlSGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdEhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9TdHJlYW1IYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvU3RyZWFtSGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9oaWRsL0hhbERlYXRoSGFuZGxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwCmluZGV4IGNjYWEyYjQuLjBkZDNmMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAKQEAgLTEgKzEgQEAKLXN1YmRpcnMgPSBbImZhY3RvcnkiXQorc3ViZGlycyA9IFsiZmFjdG9yeSIsICJjb25maWciXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2NmQxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNCBAQAorLy8gRWZmZWN0IGNvbmZpZ3VyYXRpb24KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliZWZmZWN0c2NvbmZpZyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsic3JjL0VmZmVjdHNDb25maWcuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnRpbnl4bWwyIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTczMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX01FRElBX0VGRkVDVFNDT05GSUdfSAorI2RlZmluZSBBTkRST0lEX01FRElBX0VGRkVDVFNDT05GSUdfSAorCisvKiogQGZpbGUgUGFyc2VzIGF1ZGlvIGVmZmVjdHMgY29uZmlndXJhdGlvbiBmaWxlIHRvIEMgYW5kIEMrKyBzdHJ1Y3R1cmUuCisgKiBAc2VlIGF1ZGlvX2VmZmVjdHNfY29uZl9WMl8wLnhzZCBmb3IgZG9jdW1lbnRhdGlvbiBvbiBlYWNoIHN0cnVjdHVyZQorICovCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3RzQ29uZmlnIHsKKworLyoqIERlZmF1bHQgcGF0aCBvZiBlZmZlY3QgY29uZmlndXJhdGlvbiBmaWxlLiAqLworY29uc3RleHByIGNoYXIgREVGQVVMVF9QQVRIW10gPSAiL3ZlbmRvci9ldGMvYXVkaW9fZWZmZWN0cy54bWwiOworCisvKiogRGlyZWN0b3JpZXMgd2hlcmUgdGhlIGVmZmVjdCBsaWJyYXJpZXMgd2lsbCBiZSBzZWFyY2ggZm9yLiAqLworY29uc3RleHByIGNvbnN0IGNoYXIqIExEX0VGRkVDVF9MSUJSQVJZX1BBVEhbXSA9CisjaWZkZWYgX19MUDY0X18KKyAgICAgICAgeyIvb2RtL2xpYjY0L3NvdW5kZngiLCAiL3ZlbmRvci9saWI2NC9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliNjQvc291bmRmeCJ9OworI2Vsc2UKKyAgICAgICAgeyIvb2RtL2xpYi9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliL3NvdW5kZngiLCAiL3N5c3RlbS9saWIvc291bmRmeCJ9OworI2VuZGlmCisKK3N0cnVjdCBMaWJyYXJ5IHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIHN0ZDo6c3RyaW5nIHBhdGg7Cit9OwordXNpbmcgTGlicmFyaWVzID0gc3RkOjp2ZWN0b3I8TGlicmFyeT47CisKK3N0cnVjdCBFZmZlY3RJbXBsIHsKKyAgICBMaWJyYXJ5KiBsaWJyYXJ5OyAvLzwgT25seSB2YWxpZCBhcyBsb25nIGFzIHRoZSBhc3NvY2lhdGVkIGxpYnJhcnkgdmVjdG9yIGlzIHVubW9kaWZpZWQKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Cit9OworCitzdHJ1Y3QgRWZmZWN0IDogcHVibGljIEVmZmVjdEltcGwgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYm9vbCBpc1Byb3h5OworICAgIEVmZmVjdEltcGwgbGliU3c7IC8vPCBPbmx5IHZhbGlkIGlmIGlzUHJveHkKKyAgICBFZmZlY3RJbXBsIGxpYkh3OyAvLzwgT25seSB2YWxpZCBpZiBpc1Byb3h5Cit9OworCit1c2luZyBFZmZlY3RzID0gc3RkOjp2ZWN0b3I8RWZmZWN0PjsKKwordGVtcGxhdGUgPGNsYXNzIFR5cGU+CitzdHJ1Y3QgU3RyZWFtIHsKKyAgICBUeXBlIHR5cGU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxFZmZlY3Q+PiBlZmZlY3RzOworfTsKK3VzaW5nIE91dHB1dFN0cmVhbSA9IFN0cmVhbTxhdWRpb19zdHJlYW1fdHlwZV90PjsKK3VzaW5nIElucHV0U3RyZWFtID0gU3RyZWFtPGF1ZGlvX3NvdXJjZV90PjsKKworLyoqIFBhcnNlZCBjb25maWd1cmF0aW9uLgorICogSW50ZW5kZWQgdG8gYmUgYSB0cmFuc2llbnQgc3RydWN0dXJlIG9ubHkgdXNlZCBmb3IgZGVzZXJpYWxpemF0aW9uLgorICogTm90ZTogRXZlcnl0aGluZyBpcyBjb3BpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgeG1sIGRvbS4KKyAqICAgICAgIElmIGNvcGllcyBuZWVkZWQgdG8gYmUgYXZvaWRlZCBkdWUgdG8gcGVyZm9ybWFuY2UgaXNzdWUsCisgKiAgICAgICBjb25zaWRlciBrZWVwaW5nIGEgcHJpdmF0ZSBoYW5kbGUgb24gdGhlIHhtbCBkb20gYW5kIHJlcGxhY2UgYWxsIHN0cmluZ3MgYnkgZG9tIHBvaW50ZXJzLgorICogICAgICAgT3IgZXZlbiBiZXR0ZXIsIHVzZSBTQVggcGFyc2luZyB0byBhdm9pZCB0aGUgYWxsb2NhdGlvbnMgYWxsIHRvZ2V0aGVyLgorICovCitzdHJ1Y3QgQ29uZmlnIHsKKyAgICBmbG9hdCB2ZXJzaW9uOworICAgIExpYnJhcmllcyBsaWJyYXJpZXM7CisgICAgRWZmZWN0cyBlZmZlY3RzOworICAgIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbT4gcG9zdHByb2Nlc3M7CisgICAgc3RkOjp2ZWN0b3I8SW5wdXRTdHJlYW0+IHByZXByb2Nlc3M7Cit9OworCisvKiogUmVzdWx0IG9mIGBwYXJzZShjb25zdCBjaGFyKilgICovCitzdHJ1Y3QgUGFyc2luZ1Jlc3VsdCB7CisgICAgLyoqIFBhcnNlZCBjb25maWcsIG51bGxwdHIgaWYgdGhlIHhtbCBsaWIgY291bGQgbm90IGxvYWQgdGhlIGZpbGUgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiBwYXJzZWRDb25maWc7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQ7IC8vPCBOdW1iZXIgb2Ygc2tpcHBlZCBpbnZhbGlkIGxpYnJhcnksIGVmZmVjdCBvciBwcm9jZXNzaW5nIGNoYWluCit9OworCisvKiogUGFyc2VzIHRoZSBwcm92aWRlZCBlZmZlY3QgY29uZmlndXJhdGlvbi4KKyAqIFBhcnNpbmcgZG8gbm90IHN0b3Agb2YgZmlyc3QgaW52YWxpZCBlbGVtZW50LCBidXQgY29udGludWVzIHRvIHRoZSBuZXh0LgorICogQHNlZSBQYXJzaW5nUmVzdWx0OjpuYlNraXBwZWRFbGVtZW50CisgKi8KK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCA9IERFRkFVTFRfUEFUSCk7CisKK30gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9FRkZFQ1RTQ09ORklHX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQ2MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzQ29uZmlnIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDx0aW55eG1sMi5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNDb25maWcuaD4KKwordXNpbmcgbmFtZXNwYWNlIHRpbnl4bWwyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0c0NvbmZpZyB7CisKKy8qKiBBbGwgZnVuY3Rpb25zIGV4Y2VwdCBgcGFyc2UoY29uc3QgY2hhciopYCBhcmUgc3RhdGljLiAqLworbmFtZXNwYWNlIHsKKworLyoqIEByZXR1cm4gYWxsIGBub2RlYHMgY2hpbGRyZW4gdGhhdCBhcmUgZWxlbWVudHMgYW5kIG1hdGNoIHRoZSB0YWcgaWYgcHJvdmlkZWQuICovCitzdGQ6OnZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IFhNTEVsZW1lbnQ+PiBnZXRDaGlsZHJlbihjb25zdCBYTUxOb2RlJiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2hpbGRUYWcgPSBudWxscHRyKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBYTUxFbGVtZW50Pj4gY2hpbGRyZW47CisgICAgZm9yIChhdXRvKiBjaGlsZCA9IG5vZGUuRmlyc3RDaGlsZEVsZW1lbnQoY2hpbGRUYWcpOyBjaGlsZCAhPSBudWxscHRyOworICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+TmV4dFNpYmxpbmdFbGVtZW50KGNoaWxkVGFnKSkgeworICAgICAgICBjaGlsZHJlbi5lbXBsYWNlX2JhY2soKmNoaWxkKTsKKyAgICB9CisgICAgcmV0dXJuIGNoaWxkcmVuOworfQorCisvKiogQHJldHVybiB4bWwgZHVtcCBvZiB0aGUgcHJvdmlkZWQgZWxlbWVudC4KKyAqIEJ5IG5vdCBwcm92aWRpbmcgYSBwcmludGVyLCBpdCBpcyBpbXBsaWNpdGx5IGNyZWF0ZWQgaW4gdGhlIGNhbGxlciBjb250ZXh0LgorICogSW4gc3VjaCBjYXNlIHRoZSByZXR1cm4gcG9pbnRlciBoYXMgdGhlIHNhbWUgbGlmZXRpbWUgYXMgdGhlIGV4cHJlc3Npb24gY29udGFpbmluZyBkdW1wKCkuCisgKi8KK2NvbnN0IGNoYXIqIGR1bXAoY29uc3QgWE1MRWxlbWVudCYgZWxlbWVudCwgWE1MUHJpbnRlciYmIHByaW50ZXIgPSB7fSkgeworICAgIGVsZW1lbnQuQWNjZXB0KCZwcmludGVyKTsKKyAgICByZXR1cm4gcHJpbnRlci5DU3RyKCk7Cit9CisKKworYm9vbCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKQoreworICAgIHVpbnQzMl90IHRtcFsxMF07CisKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHV1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIHV1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIHV1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICB1dWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIHV1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgdXVpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICB1dWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIHV1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgdXVpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvKiogTWFwIHRoZSBlbnVtIGFuZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcgdHlwZS4KKyAqICBJbnRlbmRlZCB0byBiZSBzcGVjaWFsaXplZCBmb3IgZWFjaCBlbnVtIHRvIGRlc2VyaWFsaXplLgorICogIFRoZSBnZW5lcmFsIHRlbXBsYXRlIGlzIGRpc2FibGVkLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgRW51bT4KK2NvbnN0ZXhwciBzdGQ6OmVuYWJsZV9pZjxmYWxzZSwgRW51bT4gU1RSRUFNX05BTUVfTUFQOworCisvKiogQWxsIG91dHB1dCBzdHJlYW0gdHlwZXMgd2hpY2ggc3VwcG9ydCBlZmZlY3RzLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc2luayB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KKyAqLwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc3RyZWFtX3R5cGVfdCwgY29uc3QgY2hhcio+IFNUUkVBTV9OQU1FX01BUDxhdWRpb19zdHJlYW1fdHlwZV90PltdID0geworICAgICAgICB7QVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsICJ2b2ljZV9jYWxsIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fU1lTVEVNLCAic3lzdGVtIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fUklORywgInJpbmcifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9NVVNJQywgIm11c2ljIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fQUxBUk0sICJhbGFybSJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgIm5vdGlmaWNhdGlvbiJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08sICJibHVldG9vdGhfc2NvIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwgImVuZm9yY2VkX2F1ZGlibGUifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9EVE1GLCAiZHRtZiJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX1RUUywgInR0cyJ9LAorfTsKKworLyoqIEFsbCBpbnB1dCBzdHJlYW0gdHlwZXMgd2hpY2ggc3VwcG9ydCBlZmZlY3RzLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc2luayB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KKyAqLwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc291cmNlX3QsIGNvbnN0IGNoYXIqPiBTVFJFQU1fTkFNRV9NQVA8YXVkaW9fc291cmNlX3Q+W10gPSB7CisgICAgICAgIHtBVURJT19TT1VSQ0VfTUlDLCAibWljIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LLCAidm9pY2VfdXBsaW5rIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTkssICJ2b2ljZV9kb3dubGluayJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NBTEwsICJ2b2ljZV9jYWxsIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfQ0FNQ09SREVSLCAiY2FtY29yZGVyIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sICJ2b2ljZV9yZWNvZ25pdGlvbiJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sICJ2b2ljZV9jb21tdW5pY2F0aW9uIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsICJ1bnByb2Nlc3NlZCJ9LAorfTsKKworLyoqIEZpbmQgdGhlIHN0cmVhbSB0eXBlIGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgc3RyZWFtIHR5cGUgbmFtZSBvciByZXR1cm4gZmFsc2UgKi8KK3RlbXBsYXRlIDxjbGFzcyBUeXBlPgorYm9vbCBzdHJpbmdUb1N0cmVhbVR5cGUoY29uc3QgY2hhciAqc3RyZWFtTmFtZSwgVHlwZSogdHlwZSkKK3sKKyAgICBmb3IgKGF1dG8mIHN0cmVhbU5hbWVQYWlyIDogU1RSRUFNX05BTUVfTUFQPFR5cGU+KSB7CisgICAgICAgIGlmIChzdHJjbXAoc3RyZWFtTmFtZVBhaXIuc2Vjb25kLCBzdHJlYW1OYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAqdHlwZSA9IHN0cmVhbU5hbWVQYWlyLmZpcnN0OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiogUGFyc2UgYSBsaWJyYXJ5IHhtbCBub3RlIGFuZCBwdXNoIHRoZSByZXN1bHQgaW4gbGlicmFyaWVzIG9yIHJldHVybiBmYWxzZSBvbiBmYWlsdXJlLiAqLworYm9vbCBwYXJzZUxpYnJhcnkoY29uc3QgWE1MRWxlbWVudCYgeG1sTGlicmFyeSwgTGlicmFyaWVzKiBsaWJyYXJpZXMpIHsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0geG1sTGlicmFyeS5BdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICBjb25zdCBjaGFyKiBwYXRoID0geG1sTGlicmFyeS5BdHRyaWJ1dGUoInBhdGgiKTsKKyAgICBpZiAobmFtZSA9PSBudWxscHRyIHx8IHBhdGggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgibGlicmFyeSBtdXN0IGhhdmUgYSBuYW1lIGFuZCBhIHBhdGg6ICVzIiwgZHVtcCh4bWxMaWJyYXJ5KSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbGlicmFyaWVzLT5wdXNoX2JhY2soe25hbWUsIHBhdGh9KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIEZpbmQgYW4gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gYnkgaXRzIG5hbWUuCisgKiBAcmV0dXJuIG51bGxwdHIgaWYgbm90IGZvdW5kLCB0aGUgZWxsZW1lbnRzIGFkZHJlc3MgaWYgZm91bmQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorVCogZmluZEJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBzdGQ6OnZlY3RvcjxUPiYgY29sbGVjdGlvbikgeworICAgIGF1dG8gaXQgPSBmaW5kX2lmKGJlZ2luKGNvbGxlY3Rpb24pLCBlbmQoY29sbGVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdIChhdXRvJiBpdGVtKSB7IHJldHVybiBpdGVtLm5hbWUgPT0gbmFtZTsgfSk7CisgICAgcmV0dXJuIGl0ICE9IGVuZChjb2xsZWN0aW9uKSA/ICYqaXQgOiBudWxscHRyOworfQorCisvKiogUGFyc2UgYW4gZWZmZWN0IGZyb20gYW4geG1sIGVsZW1lbnQgZGVzY3JpYmluZyBpdC4KKyAqIEByZXR1cm4gdHJ1ZSBhbmQgcHVzaGVzIHRoZSBlZmZlY3QgaW4gZWZmZWN0cyBvbiBzdWNjZXNzLAorICogICAgICAgICBmYWxzZSBvbiBmYWlsdXJlLiAqLworYm9vbCBwYXJzZUVmZmVjdChjb25zdCBYTUxFbGVtZW50JiB4bWxFZmZlY3QsIExpYnJhcmllcyYgbGlicmFyaWVzLCBFZmZlY3RzKiBlZmZlY3RzKSB7CisgICAgRWZmZWN0IGVmZmVjdHt9OworCisgICAgY29uc3QgY2hhciogbmFtZSA9IHhtbEVmZmVjdC5BdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBtdXN0IGhhdmUgYSBuYW1lOiAlcyIsIHhtbEVmZmVjdC5WYWx1ZSgpLCBkdW1wKHhtbEVmZmVjdCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVmZmVjdC5uYW1lID0gbmFtZTsKKworICAgIC8vIEZ1bmN0aW9uIHRvIHBhcnNlIGVmZmVjdC5saWJyYXJ5IGFuZCBlZmZlY3QudXVpZCBmcm9tIHhtbAorICAgIGF1dG8gcGFyc2VJbXBsID0gWyZsaWJyYXJpZXNdKGNvbnN0IFhNTEVsZW1lbnQmIHhtbEltcGwsIEVmZmVjdEltcGwmIGVmZmVjdCkgeworICAgICAgICAvLyBSZXRyaWV2ZSBsaWJyYXJ5IG5hbWUgYW5kIHV1aWQgZnJvbSB4bWwKKyAgICAgICAgY29uc3QgY2hhciogbGlicmFyeU5hbWUgPSB4bWxJbXBsLkF0dHJpYnV0ZSgibGlicmFyeSIpOworICAgICAgICBjb25zdCBjaGFyKiB1dWlkID0geG1sSW1wbC5BdHRyaWJ1dGUoInV1aWQiKTsKKyAgICAgICAgaWYgKGxpYnJhcnlOYW1lID09IG51bGxwdHIgfHwgdXVpZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiZWZmZWN0IG11c3QgaGF2ZSBhIGxpYnJhcnkgbmFtZSBhbmQgYSB1dWlkOiAlcyIsIGR1bXAoeG1sSW1wbCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29udmVydCBsaWJyYXJ5IG5hbWUgdG8gYSBwb2ludGVyIHRvIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBsaWJyYXJ5CisgICAgICAgIGF1dG8qIGxpYnJhcnkgPSBmaW5kQnlOYW1lKGxpYnJhcnlOYW1lLCBsaWJyYXJpZXMpOworICAgICAgICBpZiAobGlicmFyeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgbGlicmFyeSByZWZlcmVuY2VkIGluOiAlcyIsIGR1bXAoeG1sSW1wbCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVmZmVjdC5saWJyYXJ5ID0gbGlicmFyeTsKKworICAgICAgICBpZiAoIXN0cmluZ1RvVXVpZCh1dWlkLCAmZWZmZWN0LnV1aWQpKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB1dWlkIGluOiAlcyIsIGR1bXAoeG1sSW1wbCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH07CisKKyAgICBpZiAoIXBhcnNlSW1wbCh4bWxFZmZlY3QsIGVmZmVjdCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEhhbmRsZSBwcm94eSBlZmZlY3RzCisgICAgZWZmZWN0LmlzUHJveHkgPSBmYWxzZTsKKyAgICBpZiAoc3RkOjpzdHJjbXAoeG1sRWZmZWN0Lk5hbWUoKSwgImVmZmVjdFByb3h5IikgPT0gMCkgeworICAgICAgICBlZmZlY3QuaXNQcm94eSA9IHRydWU7CisKKyAgICAgICAgLy8gRnVuY3Rpb24gdG8gcGFyc2UgbGliaHcgYW5kIGxpYnN3CisgICAgICAgIGF1dG8gcGFyc2VQcm94eSA9IFsmeG1sRWZmZWN0LCAmcGFyc2VJbXBsXShjb25zdCBjaGFyKiB0YWcsIEVmZmVjdEltcGwmIHByb3h5TGliKSB7CisgICAgICAgICAgICBhdXRvKiB4bWxQcm94eUxpYiA9IHhtbEVmZmVjdC5GaXJzdENoaWxkRWxlbWVudCh0YWcpOworICAgICAgICAgICAgaWYgKHhtbFByb3h5TGliID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZWZmZWN0UHJveHkgbXVzdCBjb250YWluIGEgPCVzPjogJXMiLCB0YWcsIGR1bXAoKnhtbFByb3h5TGliKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW1wbCgqeG1sUHJveHlMaWIsIHByb3h5TGliKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCFwYXJzZVByb3h5KCJsaWJodyIsIGVmZmVjdC5saWJIdykgfHwgIXBhcnNlUHJveHkoImxpYnN3IiwgZWZmZWN0LmxpYlN3KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgZWZmZWN0cy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShlZmZlY3QpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIFBhcnNlIGFuIHN0cmVhbSBmcm9tIGFuIHhtbCBlbGVtZW50IGRlc2NyaWJpbmcgaXQuCisgKiBAcmV0dXJuIHRydWUgYW5kIHB1c2hlcyB0aGUgc3RyZWFtIGluIHN0cmVhbXMgb24gc3VjY2VzcywKKyAqICAgICAgICAgZmFsc2Ugb24gZmFpbHVyZS4gKi8KK3RlbXBsYXRlIDxjbGFzcyBTdHJlYW0+Citib29sIHBhcnNlU3RyZWFtKGNvbnN0IFhNTEVsZW1lbnQmIHhtbFN0cmVhbSwgRWZmZWN0cyYgZWZmZWN0cywgc3RkOjp2ZWN0b3I8U3RyZWFtPiogc3RyZWFtcykgeworICAgIGNvbnN0IGNoYXIqIHN0cmVhbVR5cGUgPSB4bWxTdHJlYW0uQXR0cmlidXRlKCJ0eXBlIik7CisgICAgaWYgKHN0cmVhbVR5cGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgic3RyZWFtIG11c3QgaGF2ZSBhIHR5cGU6ICVzIiwgZHVtcCh4bWxTdHJlYW0pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTdHJlYW0gc3RyZWFtOworICAgIGlmICghc3RyaW5nVG9TdHJlYW1UeXBlKHN0cmVhbVR5cGUsICZzdHJlYW0udHlwZSkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJXM6ICVzIiwgc3RyZWFtVHlwZSwgZHVtcCh4bWxTdHJlYW0pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoYXV0byYgeG1sQXBwbHkgOiBnZXRDaGlsZHJlbih4bWxTdHJlYW0sICJhcHBseSIpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGVmZmVjdE5hbWUgPSB4bWxBcHBseS5nZXQoKS5BdHRyaWJ1dGUoImVmZmVjdCIpOworICAgICAgICBpZiAoZWZmZWN0TmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgic3RyZWFtL2FwcGx5IG11c3QgaGF2ZSByZWZlcmVuY2UgYW4gZWZmZWN0OiAlcyIsIGR1bXAoeG1sQXBwbHkpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvKiBlZmZlY3QgPSBmaW5kQnlOYW1lKGVmZmVjdE5hbWUsIGVmZmVjdHMpOworICAgICAgICBpZiAoZWZmZWN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBlZmZlY3QgcmVmZXJlbmNlZCBpbjogJXMiLCBkdW1wKHhtbEFwcGx5KSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtLmVmZmVjdHMuZW1wbGFjZV9iYWNrKCplZmZlY3QpOworICAgIH0KKyAgICBzdHJlYW1zLT5wdXNoX2JhY2soc3RkOjptb3ZlKHN0cmVhbSkpOworICAgIHJldHVybiB0cnVlOworfQorCit9OyAvLyBuYW1lc3BhY2UKKworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgWE1MRG9jdW1lbnQgZG9jOworICAgIGRvYy5Mb2FkRmlsZShwYXRoKTsKKyAgICBpZiAoZG9jLkVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSAlczogVGlueXhtbDIgZXJyb3IgKCVkKTogJXMgJXMiLCBwYXRoLAorICAgICAgICAgICAgICBkb2MuRXJyb3JJRCgpLCBkb2MuR2V0RXJyb3JTdHIxKCksIGRvYy5HZXRFcnJvclN0cjIoKSk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorCisgICAgYXV0byBjb25maWcgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbmZpZz4oKTsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudHMgPSAwOworICAgIGF1dG8gcmVnaXN0ZXJGYWlsdXJlID0gWyZuYlNraXBwZWRFbGVtZW50c10oYm9vbCByZXN1bHQpIHsKKyAgICAgICAgbmJTa2lwcGVkRWxlbWVudHMgKz0gcmVzdWx0ID8gMCA6IDE7CisgICAgfTsKKyAgICBmb3IgKGF1dG8mIHhtbENvbmZpZyA6IGdldENoaWxkcmVuKGRvYywgImF1ZGlvX2VmZmVjdHNfY29uZiIpKSB7CisKKyAgICAgICAgLy8gUGFyc2UgbGlicmFyeQorICAgICAgICBmb3IgKGF1dG8mIHhtbExpYnJhcmllcyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgImxpYnJhcmllcyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbExpYnJhcnkgOiBnZXRDaGlsZHJlbih4bWxMaWJyYXJpZXMsICJsaWJyYXJ5IikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VMaWJyYXJ5KHhtbExpYnJhcnksICZjb25maWctPmxpYnJhcmllcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgZWZmZWN0cworICAgICAgICBmb3IgKGF1dG8mIHhtbEVmZmVjdHMgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJlZmZlY3RzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sRWZmZWN0IDogZ2V0Q2hpbGRyZW4oeG1sRWZmZWN0cykpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VFZmZlY3QoeG1sRWZmZWN0LCBjb25maWctPmxpYnJhcmllcywgJmNvbmZpZy0+ZWZmZWN0cykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgcHJlIHByb2Nlc3NpbmcgY2hhaW5zCisgICAgICAgIGZvciAoYXV0byYgeG1sUHJlcHJvY2VzcyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgInByZXByb2Nlc3MiKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB4bWxTdHJlYW0gOiBnZXRDaGlsZHJlbih4bWxQcmVwcm9jZXNzLCAic3RyZWFtIikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VTdHJlYW0oeG1sU3RyZWFtLCBjb25maWctPmVmZmVjdHMsICZjb25maWctPnByZXByb2Nlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHBvc3QgcHJvY2Vzc2luZyBjaGFpbnMKKyAgICAgICAgZm9yIChhdXRvJiB4bWxQb3N0cHJvY2VzcyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgInBvc3Rwcm9jZXNzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sU3RyZWFtIDogZ2V0Q2hpbGRyZW4oeG1sUG9zdHByb2Nlc3MsICJzdHJlYW0iKSkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyRmFpbHVyZShwYXJzZVN0cmVhbSh4bWxTdHJlYW0sIGNvbmZpZy0+ZWZmZWN0cywgJmNvbmZpZy0+cG9zdHByb2Nlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ge3N0ZDo6bW92ZShjb25maWcpLCBuYlNraXBwZWRFbGVtZW50c307Cit9CisKK30gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKaW5kZXggNzNmNmVmNS4uMjhiOTZkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDcgQEAKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQlVJTERfRkxPQVQKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCiAKIExPQ0FMX0hFQURFUl9MSUJSQVJJRVMgKz0gbGliaGFyZHdhcmVfaGVhZGVycwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKaW5kZXggZjI3ZDVjYS4uNTE5ZjRhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCkBAIC0zMyw2ICszMywxMCBAQAogCiAjZGVmaW5lIE1JTlVTXzNfREJfSU5fUTE5XzEyIDI4OTYgLy8gLTNkQiA9IDAuNzA3ICogMl4xMiA9IDI4OTYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIE1JTlVTXzNfREJfSU5fRkxPQVQgMC43MDcxMDY3OGYgLy8gLTNkQiA9IDAuNzA3MTA2NzhmCisjZW5kaWYKKwogLy8gc3Vic2V0IG9mIHBvc3NpYmxlIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlcywgYW5kIEFVRElPX0NIQU5ORUxfT1VUXyogcmVuYW1lZCB0byBDSEFOTkVMX01BU0tfKgogdHlwZWRlZiBlbnVtIHsKICAgICBDSEFOTkVMX01BU0tfUVVBRF9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLApAQCAtODIsOCArODYsMTkgQEAKIAogLy8gbnVtYmVyIG9mIGVmZmVjdHMgaW4gdGhpcyBsaWJyYXJ5CiBjb25zdCBpbnQga05iRWZmZWN0cyA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7Ci0KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitzdGF0aWMgTFZNX0ZMT0FUIGNsYW1wX2Zsb2F0KExWTV9GTE9BVCBhKSB7CisgICAgaWYgKGEgPiAxLjBmKSB7CisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKyAgICBlbHNlIGlmIChhIDwgLTEuMGYpIHsKKyAgICAgICAgcmV0dXJuIC0xLjBmOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFRlc3QgY29kZQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yODYsNyArMzAxLDcgQEAKICAgICByZXR1cm4gLUVJTlZBTDsKIH0KIAotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKi0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KIAogc3RhdGljIGludCBEb3dubWl4X1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCkBAIC0zODUsNyArNDAwLDEwOCBAQAogCiAgICAgcmV0dXJuIDA7CiB9CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KKy8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLwogCitzdGF0aWMgaW50IERvd25taXhfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKKyAgICAgICAgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKSB7CisKKyAgICBkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyOworICAgIExWTV9GTE9BVCAqcFNyYywgKnBEc3Q7CisgICAgZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSA9IChkb3dubWl4X21vZHVsZV90ICopc2VsZjsKKworICAgIGlmIChwRHdtTW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBEb3dubWl4ZXIgPSAoZG93bm1peF9vYmplY3RfdCopICZwRHdtTW9kdWxlLT5jb250ZXh0OworCisgICAgaWYgKHBEb3dubWl4ZXItPnN0YXRlID09IERPV05NSVhfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGFuIHVuaW5pdGlhbGl6ZWQgZG93bm1peGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSBpZiAocERvd25taXhlci0+c3RhdGUgPT0gRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGEgbm9uLWNvbmZpZ3VyZWQgZG93bm1peGVyIik7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisKKyAgICBwU3JjID0gKExWTV9GTE9BVCAqKSBpbkJ1ZmZlci0+czE2OworICAgIHBEc3QgPSAoTFZNX0ZMT0FUICopIG91dEJ1ZmZlci0+czE2OworICAgIHNpemVfdCBudW1GcmFtZXMgPSBvdXRCdWZmZXItPmZyYW1lQ291bnQ7CisKKyAgICBjb25zdCBib29sIGFjY3VtdWxhdGUgPQorICAgICAgICAgICAgKHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKKyAgICBjb25zdCB1aW50MzJfdCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayA9IHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKKworICAgIHN3aXRjaChwRG93bm1peGVyLT50eXBlKSB7CisKKyAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX1NUUklQOgorICAgICAgICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgcFNyY1swXSk7CisgICAgICAgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIHBTcmNbMV0pOworICAgICAgICAgICAgICAgICAgcFNyYyArPSBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50OworICAgICAgICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICBwRHN0WzBdID0gcFNyY1swXTsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMV0gPSBwU3JjWzFdOworICAgICAgICAgICAgICAgICAgcFNyYyArPSBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50OworICAgICAgICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX0ZPTEQ6CisjaWZkZWYgRE9XTk1JWF9BTFdBWVNfVVNFX0dFTkVSSUNfRE9XTk1JWEVSCisgICAgICAgICAgLy8gYnlwYXNzIHRoZSBvcHRpbWl6ZWQgZG93bm1peCByb3V0aW5lcyBmb3IgdGhlIGNvbW1vbiBmb3JtYXRzCisgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKKyAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JSIgUFJJeDMyICIgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIC8vIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKKyAgICAgICAgc3dpdGNoKChkb3dubWl4X2lucHV0X2NoYW5uZWxfbWFza190KWRvd25taXhJbnB1dENoYW5uZWxNYXNrKSB7CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSzoKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9TSURFOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVF1YWQocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIQU5ORUxfTUFTS181UE9JTlQxX0JBQ0s6CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERToKKyAgICAgICAgICAgIERvd25taXhfZm9sZEZyb201UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfN1BPSU5UMToKKyAgICAgICAgICAgIERvd25taXhfZm9sZEZyb203UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICghRG93bm1peF9mb2xkR2VuZXJpYygKKyAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKIAogc3RhdGljIGludCBEb3dubWl4X0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCiAgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CkBAIC04MTgsNiArOTM0LDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKQEAgLTg0NSw3ICs5NjIsMzUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2Vsc2UKK3ZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgeworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBSTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIFJSCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gRkwgKyBSTAorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAoKHBTcmNbMF0gKyBwU3JjWzJdKSAvIDIuMGYpKTsKKyAgICAgICAgICAgIC8vIEZSICsgUlIKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKChwU3JjWzFdICsgcFNyY1szXSkgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIEZMICsgUkwKKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdCgocFNyY1swXSArIHBTcmNbMl0pIC8gMi4wZik7CisgICAgICAgICAgICAvLyBGUiArIFJSCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQoKHBTcmNbMV0gKyBwU3JjWzNdKSAvIDIuMGYpOworICAgICAgICAgICAgcFNyYyArPSA0OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MSgpCkBAIC04NjQsNiArMTAwOSw3IEBACiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKICAgICBpbnQzMl90IGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAogICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCkBAIC05MDgsNyArMTA1NCw1MiBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZWxzZQordm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisgICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKKyAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKKyAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQorICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNV07CisgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSA2OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgorICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwU3JjICs9IDY7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb203UG9pbnQxKCkKQEAgLTkyNyw2ICsxMTE4LDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKQEAgLTk3Myw4ICsxMTY1LDU0IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KLQorI2Vsc2UKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgeworICAgIExWTV9GTE9BVCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgRkMKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBMRkUKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNCBpcyBSTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA1IGlzIFJSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDYgaXMgU0wKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNyBpcyBTUgorICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAorICAgIC8vIGZvciBldmVyeSBzYW1wbGUKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzZdICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbN10gKyBwU3JjWzVdOworICAgICAgICAgICAgLy9hY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSA4OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgorICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgorICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzddICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwU3JjICs9IDg7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEb3dubWl4X2ZvbGRHZW5lcmljKCkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTAwMSw2ICsxMjM5LDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAogICAgICAgICB1aW50MzJfdCBtYXNrLCBpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogCkBAIC0xMDkyLDMgKzEzMzEsOTYgQEAKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CisjZWxzZQorYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICB1aW50MzJfdCBtYXNrLCBMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisKKyAgICBpZiAoIURvd25taXhfdmFsaWRDaGFubmVsTWFzayhtYXNrKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBoYXNTaWRlcyA9IChtYXNrICYga1NpZGVzKSAhPSAwOworICAgIGNvbnN0IGJvb2wgaGFzQmFja3MgPSAobWFzayAmIGtCYWNrcykgIT0gMDsKKworICAgIGNvbnN0IGludCBudW1DaGFuID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOworICAgIGNvbnN0IGJvb2wgaGFzRkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUik7CisgICAgY29uc3QgYm9vbCBoYXNMRkUgPQorICAgICAgICAgICAgKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSk7CisgICAgY29uc3QgYm9vbCBoYXNCQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUik7CisgICAgLy8gY29tcHV0ZSBhdCB3aGF0IGluZGV4IGVhY2ggY2hhbm5lbCBpczogc2FtcGxlcyB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgLy8gICBGTCBGUiBGQyBMRkUgQkwgQlIgQkMgU0wgU1IKKyAgICAvLyB3aGVuIGEgY2hhbm5lbCBpcyBub3QgcHJlc2VudCwgaXRzIGluZGV4IGlzIHNldCB0byB0aGUgc2FtZSBhcyB0aGUgaW5kZXggb2YgdGhlIHByZWNlZGluZworICAgIC8vIGNoYW5uZWwKKyAgICBjb25zdCBpbnQgaW5kZXhGQyAgPSBoYXNGQyAgICA/IDIgICAgICAgICAgICA6IDE7ICAgICAgICAvLyBmcm9udCBjZW50ZXIKKyAgICBjb25zdCBpbnQgaW5kZXhMRkUgPSBoYXNMRkUgICA/IGluZGV4RkMgKyAxICA6IGluZGV4RkM7ICAvLyBsb3cgZnJlcXVlbmN5CisgICAgY29uc3QgaW50IGluZGV4QkwgID0gaGFzQmFja3MgPyBpbmRleExGRSArIDEgOiBpbmRleExGRTsgLy8gYmFjayBsZWZ0CisgICAgY29uc3QgaW50IGluZGV4QlIgID0gaGFzQmFja3MgPyBpbmRleEJMICsgMSAgOiBpbmRleEJMOyAgLy8gYmFjayByaWdodAorICAgIGNvbnN0IGludCBpbmRleEJDICA9IGhhc0JDICAgID8gaW5kZXhCUiArIDEgIDogaW5kZXhCUjsgIC8vIGJhY2sgY2VudGVyCisgICAgY29uc3QgaW50IGluZGV4U0wgID0gaGFzU2lkZXMgPyBpbmRleEJDICsgMSAgOiBpbmRleEJDOyAgLy8gc2lkZSBsZWZ0CisgICAgY29uc3QgaW50IGluZGV4U1IgID0gaGFzU2lkZXMgPyBpbmRleFNMICsgMSAgOiBpbmRleFNMOyAgLy8gc2lkZSByaWdodAorCisgICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyc0xmZUNvbnRyaWI7CisgICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0CisgICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQorICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiA9IDA7CisgICAgICAgICAgICBpZiAoaGFzRkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhGQ107IH0KKyAgICAgICAgICAgIGlmIChoYXNMRkUpIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07IH0KKyAgICAgICAgICAgIGlmIChoYXNCQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEJDXTsgfQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgKj0gTUlOVVNfM19EQl9JTl9GTE9BVDsKKyAgICAgICAgICAgIC8vIGFsd2F5cyBoYXMgRkwvRlIKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXTsKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXTsKKyAgICAgICAgICAgIC8vIG1peCBpbiBzaWRlcyBhbmQgYmFja3MKKyAgICAgICAgICAgIGlmIChoYXNTaWRlcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhTTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleFNSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNCYWNrcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhCTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleEJSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgcnQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSBudW1DaGFuOworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlIGNvbnRyaWJ1dGlvbiBvZiBGQywgQkMgYW5kIExGRQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgPSAwOworICAgICAgICAgICAgaWYgKGhhc0ZDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4RkNdOyB9CisgICAgICAgICAgICBpZiAoaGFzTEZFKSB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhMRkVdOyB9CisgICAgICAgICAgICBpZiAoaGFzQkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhCQ107IH0KKyAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliICo9IE1JTlVTXzNfREJfSU5fRkxPQVQ7CisgICAgICAgICAgICAvLyBhbHdheXMgaGFzIEZML0ZSCisgICAgICAgICAgICBsdCA9IHBTcmNbMF07CisgICAgICAgICAgICBydCA9IHBTcmNbMV07CisgICAgICAgICAgICAvLyBtaXggaW4gc2lkZXMgYW5kIGJhY2tzCisgICAgICAgICAgICBpZiAoaGFzU2lkZXMpIHsKKyAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4U0xdOworICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhTUl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzQmFja3MpIHsKKyAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4QkxdOworICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhCUl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdCArPSBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAgICAgICAgIHJ0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBTcmMgKz0gbnVtQ2hhbjsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKaW5kZXggMjM5OWFiZC4uYzFiZTBmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCkBAIC0yNyw3ICsyNyw5IEBACiAqLwogCiAjZGVmaW5lIERPV05NSVhfT1VUUFVUX0NIQU5ORUxTIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZNX0ZMT0FUIGZsb2F0CisjZW5kaWYKIHR5cGVkZWYgZW51bSB7CiAgICAgRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVELAogICAgIERPV05NSVhfU1RBVEVfSU5JVElBTElaRUQsCkBAIC05NSwxMSArOTcsMTggQEAKIGludCBEb3dubWl4X1Jlc2V0KGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGJvb2wgaW5pdCk7CiBpbnQgRG93bm1peF9zZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3Qgc2l6ZSwgdm9pZCAqcFZhbHVlKTsKIGludCBEb3dubWl4X2dldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Cit2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOworYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICB1aW50MzJfdCBtYXNrLCBMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKKyNlbHNlCiB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgIHVpbnQzMl90IG1hc2ssIGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKKyNlbmRpZgogCiAjZW5kaWYgLypBTkRST0lEX0VGRkVDVERPV05NSVhfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icAppbmRleCAxNjY4MGJkLi4yMWJlNTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icApAQCAtMTAsMTMgKzEwLDE5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmVmZmVjdHMiLAogICAgIHZlbmRvcjogdHJ1ZSwKLSAgICBzcmNzOiBbIkVmZmVjdHNGYWN0b3J5LmMiXSwKKyAgICBzcmNzOiBbIkVmZmVjdHNGYWN0b3J5LmMiLAorICAgICAgICAgICAiRWZmZWN0c0NvbmZpZ0xvYWRlci5jIiwKKyAgICAgICAgICAgIkVmZmVjdHNGYWN0b3J5U3RhdGUuYyIsCisgICAgICAgICAgICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcCIsCisgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmVmZmVjdHNjb25maWciLAogICAgIF0sCisgICAgY2ZsYWdzOiBbIi1mdmlzaWJpbGl0eT1oaWRkZW4iXSwKIAogICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlIl0sCiAKQEAgLTI1LDMgKzMxLDI0IEBACiAgICAgaGVhZGVyX2xpYnM6IFsibGliZWZmZWN0c19oZWFkZXJzIl0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJlZmZlY3RzX2hlYWRlcnMiXSwKIH0KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiZHVtcEVmZmVjdENvbmZpZ0ZpbGUiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbInRlc3QvRHVtcENvbmZpZy5jcHAiXSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmVmZmVjdHNjb25maWciLAorICAgICAgICAibGliZWZmZWN0cyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6WyIuIiwgImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTczYjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCkBAIC0wLDAgKzEsNDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUNvbmZpZ0xvYWRlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgTG9jYWwgZnVuY3Rpb25zIHByb3RvdHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyBpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCk7CitzdGF0aWMgaW50IGxvYWRMaWJyYXJ5KGNub2RlICpyb290LCBjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpOworc3RhdGljIGludCBsb2FkRWZmZWN0KGNub2RlICpub2RlKTsKKy8vIFRvIGdldCBhbmQgYWRkIHRoZSBlZmZlY3QgcG9pbnRlZCBieSB0aGUgcGFzc2VkIG5vZGUgdG8gdGhlIGdTdWJFZmZlY3RMaXN0CitzdGF0aWMgaW50IGFkZFN1YkVmZmVjdChjbm9kZSAqcm9vdCk7CitzdGF0aWMgbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqcGF0aCk7CisKK3N0YXRpYyBsaWJfZW50cnlfdCAqZ0NhY2hlZExpYnJhcnk7ICAvLyBsYXN0IGxpYnJhcnkgYWNjZXNzZWQgYnkgZ2V0TGlicmFyeSgpCisKK2ludCBFZmZlY3RMb2FkRWZmZWN0Q29uZmlnKCkKK3sKKyAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgcmV0dXJuIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworCisgICAgZGF0YSA9IGxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKyAgICBsb2FkTGlicmFyaWVzKHJvb3QpOworICAgIGxvYWRFZmZlY3RzKHJvb3QpOworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJJRVNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgbG9hZExpYnJhcnkobm9kZSwgbm9kZS0+bmFtZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIF9fTFA2NF9fCisvLyBhdWRpb19lZmZlY3RzLmNvbmYgYWx3YXlzIHNwZWNpZmllcyAzMiBiaXQgbGliIHBhdGg6IGNvbnZlcnQgdG8gNjQgYml0IHBhdGggaWYgbmVlZGVkCitzdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KKyAgICAgICAgeyIvb2RtL2xpYjY0L3NvdW5kZngiLCAiL3ZlbmRvci9saWI2NC9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliNjQvc291bmRmeCJ9OworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyICprTGlicmFyeVBhdGhSb290W10gPQorICAgICAgICB7Ii9vZG0vbGliL3NvdW5kZngiLCAiL3ZlbmRvci9saWIvc291bmRmeCIsICIvc3lzdGVtL2xpYi9zb3VuZGZ4In07CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCBrTGlicmFyeVBhdGhSb290U2l6ZSA9CisgICAgICAgIChzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdCkgLyBzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdFswXSkpOworCisvLyBDaGVja3MgaWYgdGhlIGxpYnJhcnkgcGF0aCBwYXNzZWQgYXMgbGliX3BhdGhfaW4gY2FuIGJlIG9wZW5lZCBhbmQgaWYgbm90CisvLyB0cmllcyBpbiBzdGFuZGFyZCBlZmZlY3QgbGlicmFyeSBkaXJlY3RvcmllcyB3aXRoIGp1c3QgdGhlIGxpYnJhcnkgbmFtZSBhbmQgcmV0dXJucyBjb3JyZWN0IHBhdGgKKy8vIGluIGxpYl9wYXRoX291dAoraW50IGNoZWNrTGlicmFyeVBhdGgoY29uc3QgY2hhciAqbGliX3BhdGhfaW4sIGNoYXIgKmxpYl9wYXRoX291dCkgeworICAgIGNoYXIgKnN0cjsKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZTsKKyAgICBzaXplX3QgbGVuOworCisgICAgaWYgKGxpYl9wYXRoX2luID09IE5VTEwgfHwgbGliX3BhdGhfb3V0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3RybGNweShsaWJfcGF0aF9vdXQsIGxpYl9wYXRoX2luLCBQQVRIX01BWCk7CisKKyAgICAvLyBUcnkgZXhhY3QgcGF0aCBmaXJzdAorICAgIHN0ciA9IHN0cnN0cihsaWJfcGF0aF9vdXQsICIvbGliL3NvdW5kZngvIik7CisgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgbGlicmFyeSBuYW1lIGZyb20gaW5wdXQgcGF0aAorICAgIGxlbiA9IHN0ciAtIGxpYl9wYXRoX291dDsKKyAgICBsaWJfbmFtZSA9IGxpYl9wYXRoX2luICsgbGVuICsgc3RybGVuKCIvbGliL3NvdW5kZngvIik7CisKKyAgICAvLyBUaGVuIHRyeSB3aXRoIGxpYnJhcnkgbmFtZSBhbmQgc3RhbmRhcmQgcGF0aCBuYW1lcyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTGlicmFyeVBhdGhSb290U2l6ZTsgaSsrKSB7CisgICAgICAgIGNoYXIgcGF0aFtQQVRIX01BWF07CisKKyAgICAgICAgc25wcmludGYocGF0aCwKKyAgICAgICAgICAgICAgICAgUEFUSF9NQVgsCisgICAgICAgICAgICAgICAgICIlcy8lcyIsCisgICAgICAgICAgICAgICAgIGtMaWJyYXJ5UGF0aFJvb3RbaV0sCisgICAgICAgICAgICAgICAgIGxpYl9uYW1lKTsKKyAgICAgICAgaWYgKEZfT0sgPT0gYWNjZXNzKHBhdGgsIDApKSB7CisgICAgICAgICAgICBzdHJjcHkobGliX3BhdGhfb3V0LCBwYXRoKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKHN0cm5jbXAobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpICE9IDAsCisgICAgICAgICAgICAgICAgImNoZWNrTGlicmFyeVBhdGgoKSBjb3JyZWN0ZWQgbGlicmFyeSBwYXRoICVzIHRvICVzIiwgbGliX3BhdGhfaW4sIGxpYl9wYXRoX291dCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworCisKK2ludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICB2b2lkICpoZGwgPSBOVUxMOworICAgIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKmRlc2M7CisgICAgbGlzdF9lbGVtX3QgKmU7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBQQVRIX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoY2hlY2tMaWJyYXJ5UGF0aCgoY29uc3QgY2hhciAqKW5vZGUtPnZhbHVlLCBwYXRoKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgJXMiLCBwYXRoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBoZGwgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOworICAgIGlmIChoZGwgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBmYWlsZWQgdG8gb3BlbiAlcyIsIHBhdGgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGRlc2MgPSAoYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqKWRsc3ltKGhkbCwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIHN5bWJvbCAlcyIsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRyAhPSBkZXNjLT50YWcpIHsKKyAgICAgICAgQUxPR1coImdldExpYnJhcnkoKSBiYWQgdGFnICUwOHggaW4gbGliIGluZm8gc3RydWN0IiwgZGVzYy0+dGFnKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGRlc2MtPnZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGJhZCBsaWIgdmVyc2lvbiAlMDh4IiwgZGVzYy0+dmVyc2lvbik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGluIGdMaWJyYXJ5TGlzdAorICAgIGwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9lbnRyeV90KSk7CisgICAgbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOworICAgIGwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKKyAgICBsLT5oYW5kbGUgPSBoZGw7CisgICAgbC0+ZGVzYyA9IGRlc2M7CisgICAgbC0+ZWZmZWN0cyA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZsLT5sb2NrLCBOVUxMKTsKKworICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gbDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKKyAgICBlLT5uZXh0ID0gZ0xpYnJhcnlMaXN0OworICAgIGdMaWJyYXJ5TGlzdCA9IGU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICBBTE9HVigiZ2V0TGlicmFyeSgpIGxpbmtlZCBsaWJyYXJ5ICVwIGZvciBwYXRoICVzIiwgbCwgcGF0aCk7CisKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgaWYgKGhkbCAhPSBOVUxMKSB7CisgICAgICAgIGRsY2xvc2UoaGRsKTsKKyAgICB9CisgICAgLy9hZGQgZW50cnkgZm9yIGxpYnJhcnkgZXJyb3JzIGluIGdMaWJyYXJ5RmFpbGVkTGlzdAorICAgIGxpYl9mYWlsZWRfZW50cnlfdCAqZmwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9mYWlsZWRfZW50cnlfdCkpOworICAgIGZsLT5uYW1lID0gc3RybmR1cChuYW1lLCBQQVRIX01BWCk7CisgICAgZmwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKKworICAgIGxpc3RfZWxlbV90ICpmZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBmZS0+b2JqZWN0ID0gZmw7CisgICAgZmUtPm5leHQgPSBnTGlicmFyeUZhaWxlZExpc3Q7CisgICAgZ0xpYnJhcnlGYWlsZWRMaXN0ID0gZmU7CisgICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgZXJyb3IgaW4gbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGZsLCBwYXRoKTsKKworICAgIHJldHVybiAtRUlOVkFMOworfQorCisvLyBUaGlzIHdpbGwgZmluZCB0aGUgbGlicmFyeSBhbmQgVVVJRCB0YWdzIG9mIHRoZSBzdWIgZWZmZWN0IHBvaW50ZWQgYnkgdGhlCisvLyBub2RlLCBnZXRzIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBhbmQgbGliX2VudHJ5X3QgYW5kIGFkZHMgdGhlIHN1YmVmZmVjdCAtCisvLyBzdWJfZW50cnlfdCB0byB0aGUgZ1N1YkVmZmVjdExpc3QKK2ludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpCit7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCIpOworICAgIGNub2RlICpub2RlOworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkOworICAgIGxpYl9lbnRyeV90ICpsOworICAgIGxpc3RfZWxlbV90ICplOworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOworICAgIGlmIChsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKKyAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKKyAgICAgICAgY2hhciBzWzQwXTsKKyAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7CisgICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7CisgICAgICAgIGZyZWUoZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyNpZiAoTE9HX05ERUJVRz09MCkKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigiYWRkU3ViRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKKyNlbmRpZgorICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJfZWZmZWN0ID0gbWFsbG9jKHNpemVvZihzdWJfZWZmZWN0X2VudHJ5X3QpKTsKKyAgICBzdWJfZWZmZWN0LT5vYmplY3QgPSBkOworICAgIC8vIGxpYl9lbnRyeV90IGlzIHN0b3JlZCBzaW5jZSB0aGUgc3ViIGVmZmVjdHMgYXJlIG5vdCBsaW5rZWQgdG8gdGhlIGxpYnJhcnkKKyAgICBzdWJfZWZmZWN0LT5saWIgPSBsOworICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gc3ViX2VmZmVjdDsKKyAgICBlLT5uZXh0ID0gZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtOworICAgIGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbSA9IGU7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCBlbmQiKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgbG9hZEVmZmVjdChub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7CisgICAgaWYgKGwgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoc3RyaW5nVG9VdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gMCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGxpYl9lbnRyeV90ICp0bXA7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGZpbmRFZmZlY3QoTlVMTCwgJnV1aWQsICZ0bXAsIE5VTEwpID09IDApIHsKKyAgICAgICAgQUxPR1coInNraXBwaW5nIGR1cGxpY2F0ZSB1dWlkICVzICVzIiwgbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgbm9kZS0+bmV4dCA/ICJhbmQgaXRzIHN1Yi1lZmZlY3RzIiA6ICIiKTsKKyAgICAgICAgc2tpcCA9IHRydWU7CisgICAgfQorCisgICAgZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIGlmIChsLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmdXVpZCwgZCkgIT0gMCkgeworICAgICAgICBjaGFyIHNbNDBdOworICAgICAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHMsIDQwKTsKKyAgICAgICAgQUxPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1s1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIHNpemVvZihzKSwgMCAvKiBpbmRlbnQgKi8pOworICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKKyNlbmRpZgorICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBkOworICAgIGlmIChza2lwKSB7CisgICAgICAgIGUtPm5leHQgPSBnU2tpcHBlZEVmZmVjdHM7CisgICAgICAgIGdTa2lwcGVkRWZmZWN0cyA9IGU7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSB7CisgICAgICAgIGUtPm5leHQgPSBsLT5lZmZlY3RzOworICAgICAgICBsLT5lZmZlY3RzID0gZTsKKyAgICB9CisKKyAgICAvLyBBZnRlciB0aGUgVVVJRCBub2RlIGluIHRoZSBjb25maWdfdHJlZSwgaWYgbm9kZS0+bmV4dCBpcyB2YWxpZCwKKyAgICAvLyB0aGF0IHdvdWxkIGJlIHN1YiBlZmZlY3Qgbm9kZS4KKyAgICAvLyBGaW5kIHRoZSBzdWIgZWZmZWN0cyBhbmQgYWRkIHRoZW0gdG8gdGhlIGdTdWJFZmZlY3RMaXN0CisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgaW50IGNvdW50ID0gMjsKKyAgICBib29sIGh3U3ViZWZ4ID0gZmFsc2UsIHN3U3ViZWZ4ID0gZmFsc2U7CisgICAgbGlzdF9zdWJfZWxlbV90ICpzdWJlID0gTlVMTDsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJBZGRpbmcgdGhlIGVmZmVjdCB0byBnRWZmZWN0U3ViTGlzdCBhcyB0aGVyZSBhcmUgc3ViIGVmZmVjdHMiKTsKKyAgICAgICAgc3ViZSA9IG1hbGxvYyhzaXplb2YobGlzdF9zdWJfZWxlbV90KSk7CisgICAgICAgIHN1YmUtPm9iamVjdCA9IGQ7CisgICAgICAgIHN1YmUtPnN1Yl9lbGVtID0gTlVMTDsKKyAgICAgICAgc3ViZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0OworICAgICAgICBnU3ViRWZmZWN0TGlzdCA9IHN1YmU7CisgICAgfQorICAgIHdoaWxlIChub2RlICE9IE5VTEwgJiYgY291bnQpIHsKKyAgICAgICBpZiAoYWRkU3ViRWZmZWN0KG5vZGUpKSB7CisgICAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGFkZCBzdWJFZmZlY3QgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgICAgIC8vIENoYW5nZSB0aGUgZ1N1YkVmZmVjdExpc3QgdG8gcG9pbnQgdG8gb2xkZXIgbGlzdDsKKyAgICAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlLT5uZXh0OworICAgICAgICAgICBmcmVlKHN1YmUtPnN1Yl9lbGVtKTsvLyBGcmVlIGFuIGFscmVhZHkgYWRkZWQgc3ViIGVmZmVjdAorICAgICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7CisgICAgICAgICAgIGZyZWUoc3ViZSk7CisgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgIH0KKyAgICAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1YkVudHJ5ID0gKHN1Yl9lZmZlY3RfZW50cnlfdCopZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtLT5vYmplY3Q7CisgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc3ViRWZmZWN0RGVzYyA9IChlZmZlY3RfZGVzY3JpcHRvcl90Kikoc3ViRW50cnktPm9iamVjdCk7CisgICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZworICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb2RpbmcKKyAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IHdpdGggUHJveHkgVVVJRAorICAgICAgIC8vIGNoZWNrIGZvciBTdyBkZXNjCisgICAgICAgIGlmICghKChzdWJFZmZlY3REZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwpKSB7CisgICAgICAgICAgICAgc3dTdWJlZnggPSB0cnVlOworICAgICAgICAgICAgICpkID0gKnN1YkVmZmVjdERlc2M7CisgICAgICAgICAgICAgZC0+dXVpZCA9IHV1aWQ7CisgICAgICAgICAgICAgQUxPR1YoImxvYWRFZmZlY3QoKSBDaGFuZ2VkIHRoZSBQcm94eSBkZXNjIik7CisgICAgICAgfSBlbHNlCisgICAgICAgICAgIGh3U3ViZWZ4ID0gdHJ1ZTsKKyAgICAgICBjb3VudC0tOworICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICAvLyAxIEhXIGFuZCAxIFNXIHN1YiBlZmZlY3QgZm91bmQuIFNldCB0aGUgb2ZmbG9hZCBmbGFnIGluIHRoZSBQcm94eSBkZXNjCisgICAgaWYgKGh3U3ViZWZ4ICYmIHN3U3ViZWZ4KSB7CisgICAgICAgIGQtPmZsYWdzIHw9IEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIGlmIChnQ2FjaGVkTGlicmFyeSAmJgorICAgICAgICAgICAgIXN0cm5jbXAoZ0NhY2hlZExpYnJhcnktPm5hbWUsIG5hbWUsIFBBVEhfTUFYKSkgeworICAgICAgICByZXR1cm4gZ0NhY2hlZExpYnJhcnk7CisgICAgfQorCisgICAgZSA9IGdMaWJyYXJ5TGlzdDsKKyAgICB3aGlsZSAoZSkgeworICAgICAgICBsaWJfZW50cnlfdCAqbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKKyAgICAgICAgaWYgKCFzdHJjbXAobC0+bmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgIGdDYWNoZWRMaWJyYXJ5ID0gbDsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisgICAgICAgIGUgPSBlLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4MjYwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiogUGFyc2VzIHRoZSBwbGF0Zm9ybSBlZmZlY3QgY29uZmlndXJhdGlvbgorICogYW5kIHN0b3JlcyBpdHMgY29udGVudCBpbiB0aGUgZ2xvYmFsIEVmZmVjdEZhY3RvcnlTdGF0ZS4gKi8KK0FORFJPSURfQVBJCitpbnQgRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpOworCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKaW5kZXggMzdjMGJiNy4uY2QwZTc2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKQEAgLTE3LDY1ICsxNyw0NiBAQAogI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5LmgiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0NvbmZpZ0xvYWRlci5oIgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKyNpbmNsdWRlICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgiCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgogCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdFZmZlY3RMaXN0OyAvLyBsaXN0IG9mIGVmZmVjdF9lbnRyeV90OiBhbGwgY3VycmVudGx5IGNyZWF0ZWQgZWZmZWN0cwotc3RhdGljIGxpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7IC8vIGxpc3Qgb2YgbGliX2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgbG9hZGVkIGxpYnJhcmllcwotc3RhdGljIGxpc3RfZWxlbV90ICpnU2tpcHBlZEVmZmVjdHM7IC8vIGxpc3Qgb2YgZWZmZWN0cyBza2lwcGVkIGJlY2F1c2Ugb2YgZHVwbGljYXRlIHV1aWQKLS8vIGxpc3Qgb2YgZWZmZWN0X2Rlc2NyaXB0b3IgYW5kIGxpc3Qgb2Ygc3ViIGVmZmVjdHMgOiBhbGwgY3VycmVudGx5IGxvYWRlZAotLy8gSXQgZG9lcyBub3QgY29udGFpbiBlZmZlY3RzIHdpdGhvdXQgc3ViIGVmZmVjdHMuCi1zdGF0aWMgbGlzdF9zdWJfZWxlbV90ICpnU3ViRWZmZWN0TGlzdDsKLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgZ0xpYkxvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOyAvLyBjb250cm9scyBhY2Nlc3MgdG8gZ0xpYnJhcnlMaXN0CiBzdGF0aWMgdWludDMyX3QgZ051bUVmZmVjdHM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG51bWJlciBvZiBlZmZlY3RzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJMaWI7ICAgIC8vIGN1cnJlbnQgbGlicmFyeSBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJFZmZlY3Q7IC8vIGN1cnJlbnQgZWZmZWN0IGluIGVudW1lcmF0aW9uIHByb2Nlc3MKIHN0YXRpYyB1aW50MzJfdCBnQ3VyRWZmZWN0SWR4OyAgICAgICAvLyBjdXJyZW50IGVmZmVjdCBpbmRleCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCi1zdGF0aWMgbGliX2VudHJ5X3QgKmdDYWNoZWRMaWJyYXJ5OyAgLy8gbGFzdCBsaWJyYXJ5IGFjY2Vzc2VkIGJ5IGdldExpYnJhcnkoKQorLyoqIE51bWJlciBvZiBlbGVtZW50cyBza2lwcGVkIGR1cmluZyB0aGUgZWZmZWN0cyBjb25maWd1cmF0aW9uIGxvYWRpbmcuCisgKiAgLTEgaWYgdGhlIGNvbmZpZyBsb2FkZXIgZmFpbGVkCisgKiAgLTIgaWYgY29uZmlnIGxvYWQgd2FzIHNraXBwZWQKKyAqLworc3RhdGljIHNzaXplX3QgZ0NvbmZpZ05iRWxlbVNraXBwZWQgPSAtMjsKIAogc3RhdGljIGludCBnSW5pdERvbmU7IC8vIHRydWUgaXMgZ2xvYmFsIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIHByZWZvcm1lZAogc3RhdGljIGludCBnQ2FuUXVlcnlFZmZlY3Q7IC8vIGluZGljYXRlcyB0aGF0IGNhbGwgdG8gRWZmZWN0UXVlcnlFZmZlY3QoKSBpcyB2YWxpZCwgaS5lLiB0aGF0IHRoZSBsaXN0IG9mIGVmZmVjdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIG5vdCBtb2RpZmllZCBzaW5jZSBsYXN0IGNhbGwgdG8gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkKLQotc3RhdGljIGxpc3RfZWxlbV90ICpnTGlicmFyeUZhaWxlZExpc3Q7ICAvL2xpc3Qgb2YgbGliX2ZhaWxlZF9lbnRyeV90OiBsaWJyYXJpZXMgZmFpbGVkIHRvIGxvYWQKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBMb2NhbCBmdW5jdGlvbnMgcHJvdG90eXBlcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdGF0aWMgaW50IGluaXQoKTsKLXN0YXRpYyBpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCk7Ci1zdGF0aWMgaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpOwotc3RhdGljIGludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSk7Ci1zdGF0aWMgaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KTsKLXN0YXRpYyBpbnQgbG9hZEVmZmVjdChjbm9kZSAqbm9kZSk7Ci0vLyBUbyBnZXQgYW5kIGFkZCB0aGUgZWZmZWN0IHBvaW50ZWQgYnkgdGhlIHBhc3NlZCBub2RlIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotc3RhdGljIGludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpOwotc3RhdGljIGxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpOwogc3RhdGljIHZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpOwogc3RhdGljIHVpbnQzMl90IHVwZGF0ZU51bUVmZmVjdHMoKTsKLXN0YXRpYyBpbnQgZmluZEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAotICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOwogLy8gVG8gc2VhcmNoIGEgc3ViZWZmZWN0IGluIHRoZSBnU3ViRWZmZWN0TGlzdAogc3RhdGljIGludCBmaW5kU3ViRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKLXN0YXRpYyB2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCk7Ci1zdGF0aWMgaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOwotc3RhdGljIGludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgZnVuY3Rpb25zCkBAIC00NjEsMTAgKzQ0MiwxMiBAQAogICAgIGlmIChpZ25vcmVGeENvbmZGaWxlcykgewogICAgICAgICBBTE9HSSgiQXVkaW8gZWZmZWN0cyBpbiBjb25maWd1cmF0aW9uIGZpbGVzIHdpbGwgYmUgaWdub3JlZCIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgICAgIGdDb25maWdOYkVsZW1Ta2lwcGVkID0gRWZmZWN0TG9hZFhtbEVmZmVjdENvbmZpZyhOVUxMKTsKKyAgICAgICAgaWYgKGdDb25maWdOYkVsZW1Ta2lwcGVkIDwgMCkgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBsb2FkIFhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiwgZmFsbGJhY2sgdG8gLmNvbmYiKTsKKyAgICAgICAgICAgIEVmZmVjdExvYWRFZmZlY3RDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChnQ29uZmlnTmJFbGVtU2tpcHBlZCA+IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJFZmZlY3QgY29uZmlnIGlzIHBhcnRpYWxseSBpbnZhbGlkLCBza2lwcGVkICV6ZCBlbGVtZW50cyIsIGdDb25maWdOYkVsZW1Ta2lwcGVkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDc0LDM2NyArNDU3LDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgY25vZGUgKnJvb3Q7Ci0gICAgY2hhciAqZGF0YTsKLQotICAgIGRhdGEgPSBsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0gICAgbG9hZExpYnJhcmllcyhyb290KTsKLSAgICBsb2FkRWZmZWN0cyhyb290KTsKLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSSUVTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGxvYWRMaWJyYXJ5KG5vZGUsIG5vZGUtPm5hbWUpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBfX0xQNjRfXwotLy8gYXVkaW9fZWZmZWN0cy5jb25mIGFsd2F5cyBzcGVjaWZpZXMgMzIgYml0IGxpYiBwYXRoOiBjb252ZXJ0IHRvIDY0IGJpdCBwYXRoIGlmIG5lZWRlZAotc3RhdGljIGNvbnN0IGNoYXIgKmtMaWJyYXJ5UGF0aFJvb3RbXSA9Ci0gICAgICAgIHsiL29kbS9saWI2NC9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliNjQvc291bmRmeCIsICIvc3lzdGVtL2xpYjY0L3NvdW5kZngifTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KLSAgICAgICAgeyIvb2RtL2xpYi9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliL3NvdW5kZngiLCAiL3N5c3RlbS9saWIvc291bmRmeCJ9OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBpbnQga0xpYnJhcnlQYXRoUm9vdFNpemUgPQotICAgICAgICAoc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3QpIC8gc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3RbMF0pKTsKLQotLy8gQ2hlY2tzIGlmIHRoZSBsaWJyYXJ5IHBhdGggcGFzc2VkIGFzIGxpYl9wYXRoX2luIGNhbiBiZSBvcGVuZWQgYW5kIGlmIG5vdAotLy8gdHJpZXMgaW4gc3RhbmRhcmQgZWZmZWN0IGxpYnJhcnkgZGlyZWN0b3JpZXMgd2l0aCBqdXN0IHRoZSBsaWJyYXJ5IG5hbWUgYW5kIHJldHVybnMgY29ycmVjdCBwYXRoCi0vLyBpbiBsaWJfcGF0aF9vdXQKLWludCBjaGVja0xpYnJhcnlQYXRoKGNvbnN0IGNoYXIgKmxpYl9wYXRoX2luLCBjaGFyICpsaWJfcGF0aF9vdXQpIHsKLSAgICBjaGFyICpzdHI7Ci0gICAgY29uc3QgY2hhciAqbGliX25hbWU7Ci0gICAgc2l6ZV90IGxlbjsKLQotICAgIGlmIChsaWJfcGF0aF9pbiA9PSBOVUxMIHx8IGxpYl9wYXRoX291dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHN0cmxjcHkobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpOwotCi0gICAgLy8gVHJ5IGV4YWN0IHBhdGggZmlyc3QKLSAgICBzdHIgPSBzdHJzdHIobGliX3BhdGhfb3V0LCAiL2xpYi9zb3VuZGZ4LyIpOwotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvLyBFeHRyYWN0IGxpYnJhcnkgbmFtZSBmcm9tIGlucHV0IHBhdGgKLSAgICBsZW4gPSBzdHIgLSBsaWJfcGF0aF9vdXQ7Ci0gICAgbGliX25hbWUgPSBsaWJfcGF0aF9pbiArIGxlbiArIHN0cmxlbigiL2xpYi9zb3VuZGZ4LyIpOwotCi0gICAgLy8gVGhlbiB0cnkgd2l0aCBsaWJyYXJ5IG5hbWUgYW5kIHN0YW5kYXJkIHBhdGggbmFtZXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0xpYnJhcnlQYXRoUm9vdFNpemU7IGkrKykgewotICAgICAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOwotCi0gICAgICAgIHNucHJpbnRmKHBhdGgsCi0gICAgICAgICAgICAgICAgIFBBVEhfTUFYLAotICAgICAgICAgICAgICAgICAiJXMvJXMiLAotICAgICAgICAgICAgICAgICBrTGlicmFyeVBhdGhSb290W2ldLAotICAgICAgICAgICAgICAgICBsaWJfbmFtZSk7Ci0gICAgICAgIGlmIChGX09LID09IGFjY2VzcyhwYXRoLCAwKSkgewotICAgICAgICAgICAgc3RyY3B5KGxpYl9wYXRoX291dCwgcGF0aCk7Ci0gICAgICAgICAgICBBTE9HV19JRihzdHJuY21wKGxpYl9wYXRoX291dCwgbGliX3BhdGhfaW4sIFBBVEhfTUFYKSAhPSAwLAotICAgICAgICAgICAgICAgICJjaGVja0xpYnJhcnlQYXRoKCkgY29ycmVjdGVkIGxpYnJhcnkgcGF0aCAlcyB0byAlcyIsIGxpYl9wYXRoX2luLCBsaWJfcGF0aF9vdXQpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotCi1pbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgdm9pZCAqaGRsID0gTlVMTDsKLSAgICBhdWRpb19lZmZlY3RfbGlicmFyeV90ICpkZXNjOwotICAgIGxpc3RfZWxlbV90ICplOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGNoYXIgcGF0aFtQQVRIX01BWF07Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgUEFUSF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKGNoZWNrTGlicmFyeVBhdGgoKGNvbnN0IGNoYXIgKilub2RlLT52YWx1ZSwgcGF0aCkgIT0gMCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBsaWJyYXJ5ICVzIiwgcGF0aCk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaGRsID0gZGxvcGVuKHBhdGgsIFJUTERfTk9XKTsKLSAgICBpZiAoaGRsID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgZmFpbGVkIHRvIG9wZW4gJXMiLCBwYXRoKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBkZXNjID0gKGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKilkbHN5bShoZGwsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7Ci0gICAgaWYgKGRlc2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBzeW1ib2wgJXMiLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmIChBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcgIT0gZGVzYy0+dGFnKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRMaWJyYXJ5KCkgYmFkIHRhZyAlMDh4IGluIGxpYiBpbmZvIHN0cnVjdCIsIGRlc2MtPnRhZyk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjLT52ZXJzaW9uKSAhPQotICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OKSkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBiYWQgbGliIHZlcnNpb24gJTA4eCIsIGRlc2MtPnZlcnNpb24pOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8vIGFkZCBlbnRyeSBmb3IgbGlicmFyeSBpbiBnTGlicmFyeUxpc3QKLSAgICBsID0gbWFsbG9jKHNpemVvZihsaWJfZW50cnlfdCkpOwotICAgIGwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKLSAgICBsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7Ci0gICAgbC0+aGFuZGxlID0gaGRsOwotICAgIGwtPmRlc2MgPSBkZXNjOwotICAgIGwtPmVmZmVjdHMgPSBOVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbC0+bG9jaywgTlVMTCk7Ci0KLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IGw7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7Ci0gICAgZS0+bmV4dCA9IGdMaWJyYXJ5TGlzdDsKLSAgICBnTGlicmFyeUxpc3QgPSBlOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7Ci0gICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGwsIHBhdGgpOwotCi0gICAgcmV0dXJuIDA7Ci0KLWVycm9yOgotICAgIGlmIChoZGwgIT0gTlVMTCkgewotICAgICAgICBkbGNsb3NlKGhkbCk7Ci0gICAgfQotICAgIC8vYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGVycm9ycyBpbiBnTGlicmFyeUZhaWxlZExpc3QKLSAgICBsaWJfZmFpbGVkX2VudHJ5X3QgKmZsID0gbWFsbG9jKHNpemVvZihsaWJfZmFpbGVkX2VudHJ5X3QpKTsKLSAgICBmbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOwotICAgIGZsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7Ci0KLSAgICBsaXN0X2VsZW1fdCAqZmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZmUtPm9iamVjdCA9IGZsOwotICAgIGZlLT5uZXh0ID0gZ0xpYnJhcnlGYWlsZWRMaXN0OwotICAgIGdMaWJyYXJ5RmFpbGVkTGlzdCA9IGZlOwotICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGVycm9yIGluIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBmbCwgcGF0aCk7Ci0KLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotLy8gVGhpcyB3aWxsIGZpbmQgdGhlIGxpYnJhcnkgYW5kIFVVSUQgdGFncyBvZiB0aGUgc3ViIGVmZmVjdCBwb2ludGVkIGJ5IHRoZQotLy8gbm9kZSwgZ2V0cyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IgYW5kIGxpYl9lbnRyeV90IGFuZCBhZGRzIHRoZSBzdWJlZmZlY3QgLQotLy8gc3ViX2VudHJ5X3QgdG8gdGhlIGdTdWJFZmZlY3RMaXN0Ci1pbnQgYWRkU3ViRWZmZWN0KGNub2RlICpyb290KQotewotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QiKTsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Ci0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBsaXN0X2VsZW1fdCAqZTsKLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKLSAgICBpZiAobCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7Ci0gICAgICAgIGNoYXIgc1s0MF07Ci0gICAgICAgIHV1aWRUb1N0cmluZygmdXVpZCwgcywgNDApOwotICAgICAgICBBTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOwotICAgICAgICBmcmVlKGQpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0jaWYgKExPR19OREVCVUc9PTApCi0gICAgY2hhciBzWzUxMl07Ci0gICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7Ci0gICAgQUxPR1YoImFkZFN1YkVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7Ci0jZW5kaWYKLSAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9Ci0gICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7Ci0gICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViX2VmZmVjdCA9IG1hbGxvYyhzaXplb2Yoc3ViX2VmZmVjdF9lbnRyeV90KSk7Ci0gICAgc3ViX2VmZmVjdC0+b2JqZWN0ID0gZDsKLSAgICAvLyBsaWJfZW50cnlfdCBpcyBzdG9yZWQgc2luY2UgdGhlIHN1YiBlZmZlY3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBsaWJyYXJ5Ci0gICAgc3ViX2VmZmVjdC0+bGliID0gbDsKLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IHN1Yl9lZmZlY3Q7Ci0gICAgZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbTsKLSAgICBnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0gPSBlOwotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QgZW5kIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZTsKLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGxvYWRFZmZlY3Qobm9kZSk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQ7Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOwotICAgIGlmIChsID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBsaWJfZW50cnlfdCAqdG1wOwotICAgIGJvb2wgc2tpcCA9IGZhbHNlOwotICAgIGlmIChmaW5kRWZmZWN0KE5VTEwsICZ1dWlkLCAmdG1wLCBOVUxMKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJza2lwcGluZyBkdXBsaWNhdGUgdXVpZCAlcyAlcyIsIG5vZGUtPnZhbHVlLAotICAgICAgICAgICAgICAgIG5vZGUtPm5leHQgPyAiYW5kIGl0cyBzdWItZWZmZWN0cyIgOiAiIik7Ci0gICAgICAgIHNraXAgPSB0cnVlOwotICAgIH0KLQotICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKLSAgICAgICAgY2hhciBzWzQwXTsKLSAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7Ci0gICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7Ci0gICAgICAgIGZyZWUoZCk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSNpZiAoTE9HX05ERUJVRz09MCkKLSAgICBjaGFyIHNbNTEyXTsKLSAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKLSAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7Ci0jZW5kaWYKLSAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9Ci0gICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7Ci0gICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZS0+b2JqZWN0ID0gZDsKLSAgICBpZiAoc2tpcCkgewotICAgICAgICBlLT5uZXh0ID0gZ1NraXBwZWRFZmZlY3RzOwotICAgICAgICBnU2tpcHBlZEVmZmVjdHMgPSBlOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9IGVsc2UgewotICAgICAgICBlLT5uZXh0ID0gbC0+ZWZmZWN0czsKLSAgICAgICAgbC0+ZWZmZWN0cyA9IGU7Ci0gICAgfQotCi0gICAgLy8gQWZ0ZXIgdGhlIFVVSUQgbm9kZSBpbiB0aGUgY29uZmlnX3RyZWUsIGlmIG5vZGUtPm5leHQgaXMgdmFsaWQsCi0gICAgLy8gdGhhdCB3b3VsZCBiZSBzdWIgZWZmZWN0IG5vZGUuCi0gICAgLy8gRmluZCB0aGUgc3ViIGVmZmVjdHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIGludCBjb3VudCA9IDI7Ci0gICAgYm9vbCBod1N1YmVmeCA9IGZhbHNlLCBzd1N1YmVmeCA9IGZhbHNlOwotICAgIGxpc3Rfc3ViX2VsZW1fdCAqc3ViZSA9IE5VTEw7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiQWRkaW5nIHRoZSBlZmZlY3QgdG8gZ0VmZmVjdFN1Ykxpc3QgYXMgdGhlcmUgYXJlIHN1YiBlZmZlY3RzIik7Ci0gICAgICAgIHN1YmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3Rfc3ViX2VsZW1fdCkpOwotICAgICAgICBzdWJlLT5vYmplY3QgPSBkOwotICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7Ci0gICAgICAgIHN1YmUtPm5leHQgPSBnU3ViRWZmZWN0TGlzdDsKLSAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlOwotICAgIH0KLSAgICB3aGlsZSAobm9kZSAhPSBOVUxMICYmIGNvdW50KSB7Ci0gICAgICAgaWYgKGFkZFN1YkVmZmVjdChub2RlKSkgewotICAgICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBhZGQgc3ViRWZmZWN0ICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGdTdWJFZmZlY3RMaXN0IHRvIHBvaW50IHRvIG9sZGVyIGxpc3Q7Ci0gICAgICAgICAgIGdTdWJFZmZlY3RMaXN0ID0gc3ViZS0+bmV4dDsKLSAgICAgICAgICAgZnJlZShzdWJlLT5zdWJfZWxlbSk7Ly8gRnJlZSBhbiBhbHJlYWR5IGFkZGVkIHN1YiBlZmZlY3QKLSAgICAgICAgICAgc3ViZS0+c3ViX2VsZW0gPSBOVUxMOwotICAgICAgICAgICBmcmVlKHN1YmUpOwotICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICAgICB9Ci0gICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJFbnRyeSA9IChzdWJfZWZmZWN0X2VudHJ5X3QqKWdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbS0+b2JqZWN0OwotICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnN1YkVmZmVjdERlc2MgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCopKHN1YkVudHJ5LT5vYmplY3QpOwotICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKLSAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9kaW5nCi0gICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCB3aXRoIFByb3h5IFVVSUQKLSAgICAgICAvLyBjaGVjayBmb3IgU3cgZGVzYwotICAgICAgICBpZiAoISgoc3ViRWZmZWN0RGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSykgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMKSkgewotICAgICAgICAgICAgIHN3U3ViZWZ4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAqZCA9ICpzdWJFZmZlY3REZXNjOwotICAgICAgICAgICAgIGQtPnV1aWQgPSB1dWlkOwotICAgICAgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgQ2hhbmdlZCB0aGUgUHJveHkgZGVzYyIpOwotICAgICAgIH0gZWxzZQotICAgICAgICAgICBod1N1YmVmeCA9IHRydWU7Ci0gICAgICAgY291bnQtLTsKLSAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgLy8gMSBIVyBhbmQgMSBTVyBzdWIgZWZmZWN0IGZvdW5kLiBTZXQgdGhlIG9mZmxvYWQgZmxhZyBpbiB0aGUgUHJveHkgZGVzYwotICAgIGlmIChod1N1YmVmeCAmJiBzd1N1YmVmeCkgewotICAgICAgICBkLT5mbGFncyB8PSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIC8vIFNlYXJjaGVzIHRoZSBzdWIgZWZmZWN0IG1hdGNoaW5nIHRvIHRoZSBzcGVjaWZpZWQgdXVpZAogLy8gaW4gdGhlIGdTdWJFZmZlY3RMaXN0LiBJdCBnZXRzIHRoZSBsaWJfZW50cnlfdCBmb3IKIC8vIHRoZSBtYXRjaGVkIHN1Yl9lZmZlY3QgLiBVc2VkIGluIEVmZmVjdENyZWF0ZSBvZiBzdWIgZWZmZWN0cwpAQCAtODgxLDI5ICs1MDMsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0KLSAgICBpZiAoZ0NhY2hlZExpYnJhcnkgJiYKLSAgICAgICAgICAgICFzdHJuY21wKGdDYWNoZWRMaWJyYXJ5LT5uYW1lLCBuYW1lLCBQQVRIX01BWCkpIHsKLSAgICAgICAgcmV0dXJuIGdDYWNoZWRMaWJyYXJ5OwotICAgIH0KLQotICAgIGUgPSBnTGlicmFyeUxpc3Q7Ci0gICAgd2hpbGUgKGUpIHsKLSAgICAgICAgbGliX2VudHJ5X3QgKmwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7Ci0gICAgICAgIGlmICghc3RyY21wKGwtPm5hbWUsIG5hbWUpKSB7Ci0gICAgICAgICAgICBnQ2FjaGVkTGlicmFyeSA9IGw7Ci0gICAgICAgICAgICByZXR1cm4gbDsKLSAgICAgICAgfQotICAgICAgICBlID0gZS0+bmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCiB2b2lkIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKQogewogICAgIGdDdXJMaWIgPSBnTGlicmFyeUxpc3Q7CkBAIC05MzUsMTE0ICs1MzQsNiBAQAogICAgIHJldHVybiBjbnQ7CiB9CiAKLWludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCi0gICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYykKLXsKLSAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKLSAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7Ci0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7Ci0gICAgaW50IGZvdW5kID0gMDsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIHdoaWxlIChlICYmICFmb3VuZCkgewotICAgICAgICBsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OwotICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKLSAgICAgICAgd2hpbGUgKGVmeCkgewotICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKLSAgICAgICAgfQotICAgICAgICBlID0gZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0ID0gLUVOT0VOVDsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7Ci0gICAgICAgICpsaWIgPSBsOwotICAgICAgICBpZiAoZGVzYykgewotICAgICAgICAgICAgKmRlc2MgPSBkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpIHsKLSAgICBjaGFyIHNbMjU2XTsKLSAgICBjaGFyIHNzWzI1Nl07Ci0gICAgY2hhciBpZHRbaW5kZW50ICsgMV07Ci0KLSAgICBtZW1zZXQoaWR0LCAnICcsIGluZGVudCk7Ci0gICAgaWR0W2luZGVudF0gPSAwOwotCi0gICAgc3RyWzBdID0gMDsKLQotICAgIHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVzJXMgLyAlc1xuIiwgaWR0LCBkZXNjLT5uYW1lLCBkZXNjLT5pbXBsZW1lbnRvcik7Ci0gICAgc3RybGNhdChzdHIsIHMsIGxlbik7Ci0KLSAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIHNpemVvZihzKSk7Ci0gICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVVVJRDogJXNcbiIsIGlkdCwgcyk7Ci0gICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOwotCi0gICAgdXVpZFRvU3RyaW5nKCZkZXNjLT50eXBlLCBzLCBzaXplb2YocykpOwotICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFRZUEU6ICVzXG4iLCBpZHQsIHMpOwotICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKLQotICAgIHNwcmludGYocywgIiVzICBhcGlWZXJzaW9uOiAlMDhYXG4lcyAgZmxhZ3M6ICUwOFhcbiIsIGlkdCwKLSAgICAgICAgICAgIGRlc2MtPmFwaVZlcnNpb24sIGlkdCwgZGVzYy0+ZmxhZ3MpOwotICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOwotfQotCi1pbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCkKLXsKLSAgICBpbnQgdG1wWzEwXTsKLQotICAgIGlmIChzc2NhbmYoc3RyLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAotICAgICAgICAgICAgdG1wLCB0bXArMSwgdG1wKzIsIHRtcCszLCB0bXArNCwgdG1wKzUsIHRtcCs2LCB0bXArNywgdG1wKzgsIHRtcCs5KSA8IDEwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICB1dWlkLT50aW1lTG93ID0gKHVpbnQzMl90KXRtcFswXTsKLSAgICB1dWlkLT50aW1lTWlkID0gKHVpbnQxNl90KXRtcFsxXTsKLSAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uID0gKHVpbnQxNl90KXRtcFsyXTsKLSAgICB1dWlkLT5jbG9ja1NlcSA9ICh1aW50MTZfdCl0bXBbM107Ci0gICAgdXVpZC0+bm9kZVswXSA9ICh1aW50OF90KXRtcFs0XTsKLSAgICB1dWlkLT5ub2RlWzFdID0gKHVpbnQ4X3QpdG1wWzVdOwotICAgIHV1aWQtPm5vZGVbMl0gPSAodWludDhfdCl0bXBbNl07Ci0gICAgdXVpZC0+bm9kZVszXSA9ICh1aW50OF90KXRtcFs3XTsKLSAgICB1dWlkLT5ub2RlWzRdID0gKHVpbnQ4X3QpdG1wWzhdOwotICAgIHV1aWQtPm5vZGVbNV0gPSAodWludDhfdCl0bXBbOV07Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pCi17Ci0KLSAgICBzbnByaW50ZihzdHIsIG1heExlbiwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLSAgICAgICAgICAgIHV1aWQtPnRpbWVMb3csCi0gICAgICAgICAgICB1dWlkLT50aW1lTWlkLAotICAgICAgICAgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiwKLSAgICAgICAgICAgIHV1aWQtPmNsb2NrU2VxLAotICAgICAgICAgICAgdXVpZC0+bm9kZVswXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbMV0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzJdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVszXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbNF0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzVdKTsKLQotICAgIHJldHVybiAwOwotfQotCiBpbnQgRWZmZWN0RHVtcEVmZmVjdHMoaW50IGZkKSB7CiAgICAgY2hhciBzWzUxMl07CiAKQEAgLTEwOTIsNiArNTgzLDIwIEBACiAgICAgICAgICAgICBlID0gZS0+bmV4dDsKICAgICAgICAgfQogICAgIH0KKyAgICBzd2l0Y2ggKGdDb25maWdOYkVsZW1Ta2lwcGVkKSB7CisgICAgY2FzZSAtMjoKKyAgICAgICAgZHByaW50ZihmZCwgIkVmZmVjdCBjb25maWd1cmF0aW9uIGxvYWRpbmcgc2tpcHBlZC5cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIC0xOgorICAgICAgICBkcHJpbnRmKGZkLCAiWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uIGZhaWxlZCB0byBsb2FkLlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICAgICAgZHByaW50ZihmZCwgIlhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiBsb2FkZWQgc3VjY2Vzc2Z1bGx5LlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGRwcmludGYoZmQsICJYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24gcGFydGlhbGx5IGxvYWRlZCwgc2tpcHBlZCAlemQgZWxlbWVudHMuXG4iLAorICAgICAgICAgICAgICAgIGdDb25maWdOYkVsZW1Ta2lwcGVkKTsKKyAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAppbmRleCA3MmUwOTMxLi5jZGJhMzYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwpAQCAtOTYsNiArOTcsNyBAQAogLy8gICAgICAgICpwRGVzY3JpcHRvcjogICAgIHVwZGF0ZWQgd2l0aCB0aGUgc3ViIGVmZmVjdCBkZXNjcmlwdG9ycy4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RHZXRTdWJFZmZlY3RzKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICoqcFN1YmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY0MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlTdGF0ZSIKKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKworbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsKK2xpc3RfZWxlbV90ICpnU2tpcHBlZEVmZmVjdHM7CitsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0OworcHRocmVhZF9tdXRleF90IGdMaWJMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworbGlzdF9lbGVtX3QgKmdMaWJyYXJ5RmFpbGVkTGlzdDsgIC8vbGlzdCBvZiBsaWJfZmFpbGVkX2VudHJ5X3Q6IGxpYnJhcmllcyBmYWlsZWQgdG8gbG9hZAorCisKK2ludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCisgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYykKK3sKKyAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKKyAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7CisgICAgaW50IGZvdW5kID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHdoaWxlIChlICYmICFmb3VuZCkgeworICAgICAgICBsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OworICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgd2hpbGUgKGVmeCkgeworICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0ID0gLUVOT0VOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7CisgICAgICAgICpsaWIgPSBsOworICAgICAgICBpZiAoZGVzYykgeworICAgICAgICAgICAgKmRlc2MgPSBkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpCit7CisgICAgaW50IHRtcFsxMF07CisKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgdXVpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07CisgICAgdXVpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07CisgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07CisgICAgdXVpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOworICAgIHV1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07CisgICAgdXVpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKKyAgICB1dWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOworICAgIHV1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107CisgICAgdXVpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKKyAgICB1dWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKQoreworCisgICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB1dWlkLT50aW1lTG93LAorICAgICAgICAgICAgdXVpZC0+dGltZU1pZCwKKyAgICAgICAgICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMF0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzFdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVsyXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbM10sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzRdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVs1XSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCkgeworICAgIGNoYXIgc1syNTZdOworICAgIGNoYXIgc3NbMjU2XTsKKyAgICBjaGFyIGlkdFtpbmRlbnQgKyAxXTsKKworICAgIG1lbXNldChpZHQsICcgJywgaW5kZW50KTsKKyAgICBpZHRbaW5kZW50XSA9IDA7CisKKyAgICBzdHJbMF0gPSAwOworCisgICAgc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXMlcyAvICVzXG4iLCBpZHQsIGRlc2MtPm5hbWUsIGRlc2MtPmltcGxlbWVudG9yKTsKKyAgICBzdHJsY2F0KHN0ciwgcywgbGVuKTsKKworICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dXVpZCwgcywgc2l6ZW9mKHMpKTsKKyAgICBzbnByaW50Zihzcywgc2l6ZW9mKHNzKSwgIiVzICBVVUlEOiAlc1xuIiwgaWR0LCBzKTsKKyAgICBzdHJsY2F0KHN0ciwgc3MsIGxlbik7CisKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnR5cGUsIHMsIHNpemVvZihzKSk7CisgICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVFlQRTogJXNcbiIsIGlkdCwgcyk7CisgICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOworCisgICAgc3ByaW50ZihzLCAiJXMgIGFwaVZlcnNpb246ICUwOFhcbiVzICBmbGFnczogJTA4WFxuIiwgaWR0LAorICAgICAgICAgICAgZGVzYy0+YXBpVmVyc2lvbiwgaWR0LCBkZXNjLT5mbGFncyk7CisgICAgc3RybGNhdChzdHIsIHMsIGxlbik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY5NDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNGQUNUT1JZU1RBVEVfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBAZmlsZSBDb250YWlucyB0aGUgc3RhdGUgc2hhcmVkIHdpdGggY29uZmlndXJhdGlvbiBsb2FkZXIgb2YgdGhlIEVmZmVjdCBmYWN0b3J5LgorICogICAgICAgIFRoaXMgZ2xvYmFsIHN0YXRlIHNob3VsZCBwcm9iYWJseSBiZSByZWZhY3RvciBpbiBhIHN0cnVjdHVyZQorICogICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBjb25maWcgbG9hZGVyIG9uIEVmZmVjdHNGYWN0b3J5IGluaXQuCisgKiAgICAgICAgVGhpcyBoZWFkZXIgYWxzbyBjb250YWlucyBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayBvbiB0aGUgc3RhdGUuCisgKi8KKworZXh0ZXJuIGxpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7IC8vIGxpc3Qgb2YgbGliX2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgbG9hZGVkIGxpYnJhcmllcworLy8gbGlzdCBvZiBlZmZlY3RzIHNraXBwZWQgYmVjYXVzZSBvZiBkdXBsaWNhdGUgdXVpZCBvciBpbnZhbGlkIHZlcnNpb24KK2V4dGVybiBsaXN0X2VsZW1fdCAqZ1NraXBwZWRFZmZlY3RzOworLy8gbGlzdCBvZiBlZmZlY3RfZGVzY3JpcHRvciBhbmQgbGlzdCBvZiBzdWIgZWZmZWN0cyA6IGFsbCBjdXJyZW50bHkgbG9hZGVkCisvLyBJdCBkb2VzIG5vdCBjb250YWluIGVmZmVjdHMgd2l0aG91dCBzdWIgZWZmZWN0cy4KK2V4dGVybiBsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0OworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBnTGliTG9jazsgLy8gY29udHJvbHMgYWNjZXNzIHRvIGdMaWJyYXJ5TGlzdAorCitleHRlcm4gbGlzdF9lbGVtX3QgKmdMaWJyYXJ5RmFpbGVkTGlzdDsgIC8vbGlzdCBvZiBsaWJfZmFpbGVkX2VudHJ5X3Q6IGxpYnJhcmllcyBmYWlsZWQgdG8gbG9hZAorCisKKworaW50IGZpbmRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKKyAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKKworaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOworLyoqIFVzZWQgdG8gbG9nIFVVSURzICovCitpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbik7CisKKy8qKiBVc2VkIGZvciBkZWJ1Z2luZy4gKi8KK3ZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgaW5kZW50KTsKKworI2lmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlMDBmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlDb25maWdMb2FkZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorI2luY2x1ZGUgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgZWZmZWN0c0NvbmZpZzsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBMb2NhbCBmdW5jdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIHsKKworLyoqIFNpbWlsYXJseSB0byBkbG9wZW4sIGxvb2tzIGZvciB0aGUgcHJvdmlkZWQgcGF0aCBpbiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRILgorICogQHJldHVybiB0cnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGZvdW5kIGFuZCBzZXQgcmVzb2x2ZWRQYXRoIHRvIGl0cyBhYnNvbHV0ZSBwYXRoLgorICogICAgICAgICBmYWxzZSBpZiBub3QgZm91bmQKKyAqLworYm9vbCByZXNvbHZlTGlicmFyeShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIHJlc29sdmVkUGF0aCkgeworICAgIGZvciAoYXV0byogbGlicmFyeURpcmVjdG9yeSA6IExEX0VGRkVDVF9MSUJSQVJZX1BBVEgpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2FuZGlkYXRlUGF0aCA9IHN0ZDo6c3RyaW5nKGxpYnJhcnlEaXJlY3RvcnkpICsgJy8nICsgcGF0aDsKKyAgICAgICAgaWYgKGFjY2VzcyhjYW5kaWRhdGVQYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICpyZXNvbHZlZFBhdGggPSBzdGQ6Om1vdmUoY2FuZGlkYXRlUGF0aCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKiBMb2FkcyBhIGxpYnJhcnkgZ2l2ZW4gaXRzIHJlbGF0aXZlIHBhdGggYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGxpYkVudHJ5LgorICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3Mgd2l0aCBsaWJFbnRyeSdzIHBhdGgsIGhhbmRsZSBhbmQgZGVzYyBmaWxsZWQKKyAqICAgICAgICAgZmFsc2Ugb24gc3VjY2VzcyB3aXRoIGxpYkVudHJ5J3MgcGF0aCBmaWxsZWQgd2l0aCB0aGUgcGF0aCBvZiB0aGUgZmFpbGVkIGxpYgorICogVGhlIGNhbGxlciBNVVNUIGZyZWUgdGhlIHJlc291cmNlcyBwYXRoIChmcmVlKSBhbmQgaGFuZGxlIChkbGNsb3NlKSBpZiBmaWxsZWQuCisgKi8KK2Jvb2wgbG9hZExpYnJhcnkoY29uc3QgY2hhciogcmVsYXRpdmVQYXRoLCBsaWJfZW50cnlfdCogbGliRW50cnkpIG5vZXhjZXB0IHsKKworICAgIHN0ZDo6c3RyaW5nIGFic29sdXRlUGF0aDsKKyAgICBpZiAoIXJlc29sdmVMaWJyYXJ5KHJlbGF0aXZlUGF0aCwgJmFic29sdXRlUGF0aCkpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgaW4gZWZmZWN0IGRpcmVjdG9yaWVzOiAlcyIsIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIGxpYkVudHJ5LT5wYXRoID0gc3RyZHVwKHJlbGF0aXZlUGF0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgY2hhciogcGF0aCA9IGFic29sdXRlUGF0aC5jX3N0cigpOworICAgIGxpYkVudHJ5LT5wYXRoID0gc3RyZHVwKHBhdGgpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBsaWIgaXMgY2xvc2VkIG9uIGVhcmx5IHJldHVybgorICAgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBkZWNsdHlwZShkbGNsb3NlKSo+IGxpYkhhbmRsZShkbG9wZW4ocGF0aCwgUlRMRF9OT1cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGRsb3BlbiBsaWJyYXJ5ICVzOiAlcyIsIHBhdGgsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvKiBkZXNjcmlwdGlvbiA9IHN0YXRpY19jYXN0PGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QqPigKKyAgICAgICAgICBkbHN5bShsaWJIYW5kbGUuZ2V0KCksIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUikpOworICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVmZmVjdCBsaWJyYXJ5LCBmYWlsZWQgbm90IGZpbmQgc3ltYm9sICclcycgaW4gJXM6ICVzIiwKKyAgICAgICAgICAgICAgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSLCBwYXRoLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGRlc2NyaXB0aW9uLT50YWcgIT0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHKSB7CisgICAgICAgIEFMT0dFKCJCYWQgdGFnICUjMDh4IGluIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSwgZXhwZWN0ZWQgJSMwOHggZm9yIGxpYnJhcnkgJXMiLAorICAgICAgICAgICAgICBkZXNjcmlwdGlvbi0+dGFnLCBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsIHBhdGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3QgbWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGRlc2NyaXB0aW9uLT52ZXJzaW9uKTsKKyAgICB1aW50MzJfdCBleHBlY3RlZE1ham9yVmVyc2lvbiA9IEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTik7CisgICAgaWYgKG1ham9yVmVyc2lvbiAhPSBleHBlY3RlZE1ham9yVmVyc2lvbikgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWFqb3IgdmVyc2lvbiAlIzA4eCwgZXhwZWN0ZWQgJSMwOHggZm9yIGxpYnJhcnkgJXMiLAorICAgICAgICAgICAgICBtYWpvclZlcnNpb24sIGV4cGVjdGVkTWFqb3JWZXJzaW9uLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxpYkVudHJ5LT5oYW5kbGUgPSBsaWJIYW5kbGUucmVsZWFzZSgpOworICAgIGxpYkVudHJ5LT5kZXNjID0gZGVzY3JpcHRpb247CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBCZWNhdXNlIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZGVzdHJveWVkIGJ5IGMgY29kZSwgdXNpbmcgbmV3IHRvIGFsbG9jYXRlIHNoYXJlZCBzdHJ1Y3R1cmUKKyAqIGlzIG5vdCBwb3NzaWJsZS4gUHJvdmlkZSBhIGVxdWl2YWxlbnQgb2YgdW5pcXVlX3B0ciBmb3IgbWFsbG9jL2ZyZWVkIHN0cnVjdHVyZSB0byBtYWtlIHN1cmUKKyAqIHRoZXkgYXJlIG5vdCBsZWFrZWQgaW4gdGhlIGMrKyBjb2RlLgorIEB7ICovCitzdHJ1Y3QgRnJlZURlbGV0ZXIgeworICAgIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiBwKSB7CisgICAgICAgIGZyZWUocCk7CisgICAgfQorfTsKKy8qKiB1bmlxdWVfcHRyIGZvciBvYmplY3QgY3JlYXRlZCB3aXRoIG1hbGxvYy4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgordXNpbmcgVW5pcXVlQ1B0ciA9IHN0ZDo6dW5pcXVlX3B0cjxULCBGcmVlRGVsZXRlcj47CisKKy8qKiBjIHZlcnNpb24gb2Ygc3RkOjptYWtlX3VuaXF1ZS4gVXNlcyBtYWxsb2MgYW5kIGZyZWUuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1VuaXF1ZUNQdHI8VD4gbWFrZVVuaXF1ZUMoKSB7CisgICAgVCogcHRyID0gbmV3IChtYWxsb2Moc2l6ZW9mKFQpKSkgVHt9OyAvLyBVc2UgcGxhY2VtZW50IG5ldyB0byBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUKKyAgICByZXR1cm4gVW5pcXVlQ1B0cjxUPntwdHJ9OworfQorCisvKiogQH0gKi8KKworLyoqIFB1c2ggYW4gbm90IG93bmVkIGVsZW1lbnQgaW4gYSBsaXN0X2VsZW0gbGluayBsaXN0IHdpdGggYW4gb3B0aW9uYWwgbG9jay4gKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBMaXN0RWxlbT4KK3ZvaWQgbGlzdFB1c2goVCogb2JqZWN0LCBMaXN0RWxlbSoqIGxpc3QsIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPSBudWxscHRyKSBub2V4Y2VwdCB7CisgICAgYXV0byBsaXN0RWxlbSA9IG1ha2VVbmlxdWVDPExpc3RFbGVtPigpOworICAgIGxpc3RFbGVtLT5vYmplY3QgPSBvYmplY3Q7CisgICAgaWYgKG11dGV4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKG11dGV4KTsKKyAgICB9CisgICAgbGlzdEVsZW0tPm5leHQgPSAqbGlzdDsKKyAgICAqbGlzdCA9IGxpc3RFbGVtLnJlbGVhc2UoKTsKKyAgICBpZiAobXV0ZXggIT0gbnVsbHB0cikgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCk7CisgICAgfQorfQorCisvKiogUHVzaCBhbiBvd25lZCBlbGVtZW50IGluIGEgbGlzdF9lbGVtIGxpbmsgbGlzdCB3aXRoIGFuIG9wdGlvbmFsIGxvY2suICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgTGlzdEVsZW0+Cit2b2lkIGxpc3RQdXNoKFVuaXF1ZUNQdHI8VD4mJiBvYmplY3QsIExpc3RFbGVtKiogbGlzdCwgcHRocmVhZF9tdXRleF90KiBtdXRleCA9IG51bGxwdHIpIG5vZXhjZXB0IHsKKyAgICBsaXN0UHVzaChvYmplY3QucmVsZWFzZSgpLCBsaXN0LCBtdXRleCk7Cit9CisKK3NpemVfdCBsb2FkTGlicmFyaWVzKGNvbnN0IGVmZmVjdHNDb25maWc6OkxpYnJhcmllcyYgbGlicywKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiogbGliTGlzdCwgcHRocmVhZF9tdXRleF90KiBsaWJMaXN0TG9jaywKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiogbGliRmFpbGVkTGlzdCkKK3sKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudCA9IDA7CisgICAgZm9yIChhdXRvJiBsaWJyYXJ5IDogbGlicykgeworCisgICAgICAgIC8vIENvbnN0cnVjdCBhIGxpYiBlbnRyeQorICAgICAgICBhdXRvIGxpYkVudHJ5ID0gbWFrZVVuaXF1ZUM8bGliX2VudHJ5X3Q+KCk7CisgICAgICAgIGxpYkVudHJ5LT5uYW1lID0gc3RyZHVwKGxpYnJhcnkubmFtZS5jX3N0cigpKTsKKyAgICAgICAgbGliRW50cnktPmVmZmVjdHMgPSBudWxscHRyOworICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJmxpYkVudHJ5LT5sb2NrLCBudWxscHRyKTsKKworICAgICAgICBpZiAoIWxvYWRMaWJyYXJ5KGxpYnJhcnkucGF0aC5jX3N0cigpLCBsaWJFbnRyeS5nZXQoKSkpIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxpYnJhcnkgbG9hZCBmYWlsdXJlCisgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUobGliRW50cnkpLCBsaWJGYWlsZWRMaXN0KTsKKyAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShsaWJFbnRyeSksIGxpYkxpc3QsIGxpYkxpc3RMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIG5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKKy8qKiBGaW5kIGEgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBsaXN0LiAqLworbGliX2VudHJ5X3QqIGZpbmRMaWJyYXJ5KGNvbnN0IGNoYXIqIG5hbWUsIGxpc3RfZWxlbV90KiBsaXN0KSB7CisKKyAgICB3aGlsZSAobGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8qIG9iamVjdCA9IHN0YXRpY19jYXN0PGxpYl9lbnRyeV90Kj4obGlzdC0+b2JqZWN0KTsKKyAgICAgICAgaWYgKHN0cmNtcChvYmplY3QtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdHJ1Y3QgVXVpZFN0ciB7CisgICAgLyoqIExlbmd0aCBvZiBhbiB1dWlkIHJlcHJlc2VudGVkIGFzIHN0cmluZy4gQFRPRE86IHVzZSBhIGNvbnN0YW50IGluc3RlYWQgb2YgNDAuICovCisgICAgY2hhciBidWZmWzQwXTsKK307CisKKy8qKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJvdmlkZWQgdXVpZC4KKyAqIEJ5IG5vdCBwcm92aWRpbmcgYW4gb3V0cHV0IGJ1ZmZlciwgaXQgaXMgaW1wbGljaXRseSBjcmVhdGVkIGluIHRoZSBjYWxsZXIgY29udGV4dC4KKyAqIEluIHN1Y2ggY2FzZSB0aGUgcmV0dXJuIHBvaW50ZXIgaGFzIHRoZSBzYW1lIGxpZmV0aW1lIGFzIHRoZSBleHByZXNzaW9uIGNvbnRhaW5pbmcgdXVpZFRvU3RyaW5nKCkKKyAqLworY2hhciogdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQsIFV1aWRTdHImJiBzdHIgPSB7fSkgeworICAgIHV1aWRUb1N0cmluZygmdXVpZCwgc3RyLmJ1ZmYsIHNpemVvZihzdHIuYnVmZikpOworICAgIHJldHVybiBzdHIuYnVmZjsKK30KKworc3RydWN0IExvYWRFZmZlY3RSZXN1bHQgeworICAgIC8qKiB0cnVlIGlmIHRoZSBlZmZlY3QgaXMgdXNhYmxlIChha2EsIGV4aXN0aW5nIGxpYiwgZGVzYywgcmlnaHQgdmVyc2lvbiwgdW5pcXVlIHV1aWQpICovCisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgLyoqIFNldCBpZiB0aGUgZWZmZWN0IGxpYiB3YXMgZm91bmQqLworICAgIGxpYl9lbnRyeV90KiBsaWIgPSBudWxscHRyOworICAgIC8vKiBTZXQgaWYgdGhlIGRlc2NyaXB0aW9uIHdhcyBzdWNjZXNzZnVseSByZXRyaWV2ZWQgZnJvbSB0aGUgbGliICovCisgICAgVW5pcXVlQ1B0cjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3REZXNjOworfTsKKworTG9hZEVmZmVjdFJlc3VsdCBsb2FkRWZmZWN0KGNvbnN0IEVmZmVjdEltcGwmIGVmZmVjdCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9lbGVtX3QqIGxpYkxpc3QpIHsKKyAgICBMb2FkRWZmZWN0UmVzdWx0IHJlc3VsdDsKKworICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBsaWJyYXJ5CisgICAgcmVzdWx0LmxpYiA9IGZpbmRMaWJyYXJ5KGVmZmVjdC5saWJyYXJ5LT5uYW1lLmNfc3RyKCksIGxpYkxpc3QpOworICAgIGlmIChyZXN1bHQubGliID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgJXMgdG8gbG9hZCBlZmZlY3QgJXMiLAorICAgICAgICAgICAgICBlZmZlY3QubGlicmFyeS0+bmFtZS5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJlc3VsdC5lZmZlY3REZXNjID0gbWFrZVVuaXF1ZUM8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4oKTsKKworICAgIC8vIEdldCB0aGUgZWZmZWN0IGRlc2NyaXB0b3IKKyAgICBpZiAocmVzdWx0LmxpYi0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJmVmZmVjdC51dWlkLCByZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSkgIT0gMCkgeworICAgICAgICBBTE9HRSgiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsCisgICAgICAgICAgICAgIHV1aWRUb1N0cmluZyhlZmZlY3QudXVpZCksIHJlc3VsdC5saWItPm5hbWUpOworICAgICAgICByZXN1bHQuZWZmZWN0RGVzYy5yZXNldCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIER1bXAgZWZmZWN0IGZvciBkZWJ1ZworI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1s1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKHJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsIHJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzKTsKKyNlbmRpZgorCisgICAgLy8gQ2hlY2sgZWZmZWN0IGlzIHN1cHBvcnRlZAorICAgIHVpbnQzMl90IGV4cGVjdGVkTWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKHJlc3VsdC5lZmZlY3REZXNjLT5hcGlWZXJzaW9uKSAhPSBleHBlY3RlZE1ham9yVmVyc2lvbikgeworICAgICAgICBBTE9HRSgiQmFkIEFQSSB2ZXJzaW9uICUjMDh4IGZvciBlZmZlY3QgJXMgaW4gbGliICVzLCBleHBlY3RlZCBtYWpvciAlIzA4eCIsCisgICAgICAgICAgICAgIHJlc3VsdC5lZmZlY3REZXNjLT5hcGlWZXJzaW9uLCBuYW1lLmNfc3RyKCksIHJlc3VsdC5saWItPm5hbWUsIGV4cGVjdGVkTWFqb3JWZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBsaWJfZW50cnlfdCAqXzsKKyAgICBpZiAoZmluZEVmZmVjdChudWxscHRyLCAmZWZmZWN0LnV1aWQsICZfLCBudWxscHRyKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJFZmZlY3QgJXMgdXVpZCAlcyBhbHJlYWR5IGV4aXN0IiwgdXVpZFRvU3RyaW5nKGVmZmVjdC51dWlkKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXN1bHQuc3VjY2VzcyA9IHRydWU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc2l6ZV90IGxvYWRFZmZlY3RzKGNvbnN0IEVmZmVjdHMmIGVmZmVjdHMsIGxpc3RfZWxlbV90KiBsaWJMaXN0LCBsaXN0X2VsZW1fdCoqIHNraXBwZWRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgIGxpc3Rfc3ViX2VsZW1fdCoqIHN1YkVmZmVjdExpc3QpIHsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudCA9IDA7CisKKyAgICBmb3IgKGF1dG8mIGVmZmVjdCA6IGVmZmVjdHMpIHsKKworICAgICAgICBhdXRvIGVmZmVjdExvYWRSZXN1bHQgPSBsb2FkRWZmZWN0KGVmZmVjdCwgZWZmZWN0Lm5hbWUsIGxpYkxpc3QpOworICAgICAgICBpZiAoIWVmZmVjdExvYWRSZXN1bHQuc3VjY2VzcykgeworICAgICAgICAgICAgaWYgKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyksIHNraXBwZWRFZmZlY3RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVmZmVjdC5pc1Byb3h5KSB7CisgICAgICAgICAgICBhdXRvIHN3RWZmZWN0TG9hZFJlc3VsdCA9IGxvYWRFZmZlY3QoZWZmZWN0LmxpYlN3LCBlZmZlY3QubmFtZSArICIgbGlic3ciLCBsaWJMaXN0KTsKKyAgICAgICAgICAgIGF1dG8gaHdFZmZlY3RMb2FkUmVzdWx0ID0gbG9hZEVmZmVjdChlZmZlY3QubGliSHcsIGVmZmVjdC5uYW1lICsgIiBsaWJodyIsIGxpYkxpc3QpOworICAgICAgICAgICAgaWYgKCFzd0VmZmVjdExvYWRSZXN1bHQuc3VjY2VzcyB8fCAhaHdFZmZlY3RMb2FkUmVzdWx0LnN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBtYWluIGVmZmVjdCBpbiB0aGUgc2tpcHBlZCBsaXN0IGV2ZW4gaWYgb25seSBhIHN1YmVmZmVjdCBpcyBpbnZhbGlkCisgICAgICAgICAgICAgICAgLy8gYXMgdGhlIG1haW4gZWZmZWN0IGlzIG5vdCB1c2FibGUgd2l0aG91dCBpdHMgc3ViZWZmZWN0cy4KKyAgICAgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUoZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjKSwgc2tpcHBlZEVmZmVjdHMpOworICAgICAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RQdXNoKCZlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MsIHN1YkVmZmVjdExpc3QpOworCisgICAgICAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCisgICAgICAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLCB3ZSByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIC8vIHN3IGVmZmVjdCBkZXNjcmlwdG9yLCBidXQga2VlcCB0aGUgUHJveHkgVVVJRAorICAgICAgICAgICAgKmVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyA9ICpzd0VmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYzsKKyAgICAgICAgICAgIGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy0+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+U2F2ZWRIZkxldmVsLCBsZXZlbCk7CiAKLSAgICBpZihBY3RpdmVQYXJhbXMuTFBGICE9IGxldmVsKXsKKyAgICBpZigoaW50MTZfdClBY3RpdmVQYXJhbXMuTFBGICE9IGxldmVsKXsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogKGlnbm9yZSBhdCBzdGFydCB1cCkgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCiAgICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwsIGxldmVsKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCBmMDhmYWJiLi4xOWIwMGYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KQEAgLTExNywxMiArMTE2LDEyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJiBjYXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKICAgICAgICAgQUxPR1YoInNldE1lZGlhQ2FzIik7CiAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oQnBNZWRpYUV4dHJhY3Rvcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYXMpKTsKKyAgICAgICAgZGF0YS53cml0ZUJ5dGVWZWN0b3IoY2FzVG9rZW4pOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRNRURJQUNBUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewpAQCAtMjA2LDE1ICsyMDUsMTQgQEAKICAgICAgICAgICAgIEFMT0dWKCJzZXRNZWRpYUNhcyIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUV4dHJhY3RvciwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBzcDxJQmluZGVyPiBjYXNCaW5kZXI7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkYXRhLnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmY2FzQmluZGVyKTsKKyAgICAgICAgICAgIEhJbnRlcmZhY2VUb2tlbiBjYXNUb2tlbjsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRhdGEucmVhZEJ5dGVWZWN0b3IoJmNhc1Rva2VuKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBjYXMgZnJvbSBwYXJjZWwiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBjYXNUb2tlbiBmcm9tIHBhcmNlbCIpOwogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxJQ2FzPiBjYXMgPSBpbnRlcmZhY2VfY2FzdDxJQ2FzPihjYXNCaW5kZXIpOwogCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRNZWRpYUNhcyhjYXMpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE1lZGlhQ2FzKGNhc1Rva2VuKSk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCmluZGV4IGFiNDBmNTMuLjFlMTNiNjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaApAQCAtMjAsMTQgKzIwLDEyIEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1ldGFEYXRhOwotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwordHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50OF90PiBISW50ZXJmYWNlVG9rZW47CiAKIGNsYXNzIElNZWRpYUV4dHJhY3RvciA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKIHB1YmxpYzoKQEAgLTY1LDcgKzYzLDcgQEAKICAgICAvLyBmb3IgRFJNCiAgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSAgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IHVpZCkgID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKaW5kZXggYWQ3ODhmNy4uMGZjMWFhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCkBAIC02MzksMTEgKzYzOSw2IEBACiAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU1RPUFBFRCk7CiAgICAgfQogCi0gICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmRlYnVnLnNmLnN0YXRzIiwgZmFsc2UpKSB7Ci0gICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKLSAgICAgICAgZHVtcCgtMSwgYXJncyk7Ci0gICAgfQotCiAgICAgbVN0YXRlID0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M7CiAgICAgbVBsYXllci0+cmVzZXRBc3luYygpOwogCkBAIC05MzUsNyArOTMwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNlbmQgY29tcGxldGlvbiBldmVudCB3aGVuIGxvb3BpbmcKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgICAgICAgICAgICAgICAgIGR1bXAoLTEsIGFyZ3MpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCmluZGV4IGY1MTE4NzYuLjAyZjc1MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icApAQCAtMSwxMyArMSw0OCBAQAorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYm5iYWlvX21vbm9fZGVmYXVsdHMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIk1vbm9QaXBlLmNwcCIsCisgICAgICAgICJNb25vUGlwZVJlYWRlci5jcHAiLAorICAgICAgICAiTkJBSU8uY3BwIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlX21vbm8iXSwKK30KKworLy8gbGlibmJhaW9fbW9ubyBpcyB0aGUgcGFydCBvZiBsaWJuYmFpbyB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgdmVuZG9ycyB0byB1c2UuIFZlbmRvciBtb2R1bGVzIGNhbid0CisvLyBsaW5rIGFnYWluc3QgbGlibmJhaW8gYW5kIHN5c3RlbSBtb2R1bGVzIGNhbid0IGxpbmsgYWdhaW5zdCBsaWJuYmFpb19tb25vLiBUaGUgcmVzdCBvZiBsaWJuYmFpbworLy8gcHVsbHMgaW4gdG9vIG1hbnkgb3RoZXIgZGVwZW5kZW5jaWVzLgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJuYmFpb19tb25vIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgZGVmYXVsdHM6IFsibGlibmJhaW9fbW9ub19kZWZhdWx0cyJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm5iYWlvIiwKKyAgICBkZWZhdWx0czogWyJsaWJuYmFpb19tb25vX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWwogICAgICAgICAiQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5jcHAiLAogICAgICAgICAiQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAiLAogICAgICAgICAiQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCIsCi0gICAgICAgICJNb25vUGlwZS5jcHAiLAotICAgICAgICAiTW9ub1BpcGVSZWFkZXIuY3BwIiwKLSAgICAgICAgIk5CQUlPLmNwcCIsCiAgICAgICAgICJOQkxvZy5jcHAiLAorICAgICAgICAiUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAiLAogICAgICAgICAiUGlwZS5jcHAiLAogICAgICAgICAiUGlwZVJlYWRlci5jcHAiLAogICAgICAgICAiU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAiLApAQCAtMjQsOCArNTksOCBAQAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtMzUsNyArNzAsNSBAQAogCiAgICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIl0sCiAKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAppbmRleCBjYmZmODdkLi44NTY0ODk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmg+CiAKQEAgLTgyLDggKzgzLDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gcG9zaXRpb242NDsKLSAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9Ci0gICAgICAgICAgICB0aW1lLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHRpbWUudHZfbnNlYzsKKyAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWUpOwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCmluZGV4IDQ4ZmZiMDEuLmUzZjQ4NzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKQEAgLTE4LDEyICsxOCwxMiBAQAogKiBEb2N1bWVudGF0aW9uOiBXb3JrZmxvdyBzdW1tYXJ5IGZvciBoaXN0b2dyYW0gZGF0YSBwcm9jZXNzaW5nOgogKiBGb3IgbW9yZSBkZXRhaWxzIG9uIEZJRk8sIHBsZWFzZSBzZWUgc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzOyBkb3h5Z2VuCiAqIFRPRE86IGFkZCB0aGlzIGRvY3VtZW50YXRpb24gdG8gZG94eWdlbiBvbmNlIGl0IGlzIGZ1cnRoZXIgZGV2ZWxvcGVkCi0qIDEpIHdyaXRpbmcgdGhlIGRhdGEgdG8gYSBidWZmZXIKLSogb25Xb3JrCisqIDEpIFdyaXRpbmcgYnVmZmVyIHBlcmlvZCB0aW1lc3RhbXAgdG8gdGhlIGNpcmN1bGFyIGJ1ZmZlcgorKiBvbldvcmsoKQogKiAgICAgQ2FsbGVkIGV2ZXJ5IHBlcmlvZCBsZW5ndGggKGUuZy4sIDRtcykKICogICAgIENhbGxzIExPR19ISVNUX1RTCiAqIExPR19ISVNUX1RTCi0qICAgICBIYXNoZXMgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgorKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCB3cml0ZXMgc2luZ2xlIHRpbWVzdGFtcCB0byBidWZmZXIKICogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUyBvbmNlCiAqIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUwogKiAgICAgY2FsbHMgTkJMT0c6OldyaXRlcjo6bG9nIG9uIGhhc2ggYW5kIGN1cnJlbnQgdGltZXN0YW1wCkBAIC01MSw2ICs1MSw3IEBACiAqIE5CTG9nOjpNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpCiAqICAgICBjYWxscyBOQkxvZzo6TWVyZ2VyOjptZXJnZQogKiBOQkxvZzo6TWVyZ2VyOjptZXJnZQorKiAgICAgTWVyZ2VzIHNuYXBzaG90cyBzb3J0ZWQgYnkgdGltZXN0YW1wCiAqICAgICBmb3IgZWFjaCByZWFkZXIgaW4gdmVjdG9yIG9mIGNsYXNzIE5hbWVkUmVhZGVyLAogKiAgICAgY2FsbHNOYW1lZFJlYWRlcjo6cmVhZGVyKCktPmdldFNuYXBzaG90CiAqICAgICBUT0RPOiBjaGVjayB3aGV0aGVyIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgcmVsZXZhbnQKQEAgLTU5LDExICs2MCwxMiBAQAogKiAgICAgY2FsbHMgbUZpZm9SZWFkZXItPm9idGFpbiB0byBmaW5kIHJlYWRhYmxlIGRhdGEKICogICAgIHNldHMgc25hcHNob3QuYmVnaW4oKSBhbmQgLmVuZCgpIGl0ZXJhdG9ycyB0byBib3VuZGFyaWVzIG9mIHZhbGlkIGVudHJpZXMKICogICAgIG1vdmVzIHRoZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciB0aGUgbGFzdCBlbnRyeSByZWFkCi0qICAgICBpbiB0aGlzIGNhc2UsIHRoZSBidWZmZXIgaXMgaW4gc2hhcmVkIG1lbW9yeS4gaW4gKDMpLCB0aGUgYnVmZmVyIGlzIHByaXZhdGUKKyogICAgIGluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciBpcyBpbiBzaGFyZWQgbWVtb3J5LiBpbiAoNCksIHRoZSBidWZmZXIgaXMgcHJpdmF0ZQogKgogKiAzKSByZWFkaW5nIHRoZSBkYXRhIGZyb20gcHJpdmF0ZSBidWZmZXIKICogTWVkaWFMb2dTZXJ2aWNlOjpkdW1wCi0qICAgICBjYWxscyBOQkxvZzo6UmVhZGVyOjpkdW1wKGludCkgb24gaW5zdGFuY2Ugb2Ygc3ViY2xhc3MgbWVyZ2VSZWFkZXIKKyogICAgIGNhbGxzIE5CTG9nOjpSZWFkZXI6OmR1bXAoQ09OU09MRSkKKyogICAgIFRoZSBwcml2YXRlIGJ1ZmZlciBjb250YWlucyBhbGwgbG9ncyBmb3IgYWxsIHJlYWRlcnMgaW4gc2hhcmVkIG1lbW9yeQogKiBOQkxvZzo6UmVhZGVyOjpkdW1wKGludCkKICogICAgIGNhbGxzIGdldFNuYXBzaG90IG9uIHRoZSBjdXJyZW50IHJlYWRlcgogKiAgICAgY2FsbHMgZHVtcChpbnQsIHNpemVfdCwgU25hcHNob3QpCkBAIC03Miw5ICs3NCwxMCBAQAogKiAgICAgKHN0cmluZywgdGltZXN0YW1wLCBldGMuLi4pCiAqICAgICBJbiB0aGUgY2FzZSBvZiBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsIGFkZHMgYSBsaXN0IG9mIHRpbWVzdGFtcCBzZXF1ZW5jZXMKICogICAgIChoaXN0b2dyYW0gZW50cnkpIHRvIE5CTG9nOjptSGlzdHMKLSogICAgIEluIHRoZSBjYXNlIG9mIEVWRU5UX0hJU1RPR1JBTV9GTFVTSCwgY2FsbHMgZHJhd0hpc3RvZ3JhbSBvbiBlYWNoIGVsZW1lbnQgaW4KLSogICAgIHRoZSBsaXN0IGFuZCBlcmFzZXMgaXQKLSogICAgIFRPRE86IHdoZW4gZG8gdGhlc2UgZXZlbnRzIG9jY3VyPworKiAgICAgVE9ETzogYWRkIGV2ZXJ5IEhJU1RPR1JBTV9FTlRSWV9UUyB0byB0d28KKyogICAgIGNpcmN1bGFyIGJ1ZmZlcnM6IG9uZSBzaG9ydC10ZXJtIGFuZCBvbmUgbG9uZy10ZXJtIChjYW4gYWRkIGV2ZW4gbG9uZ2VyLXRlcm0KKyogICAgIHN0cnVjdHVyZXMgaW4gdGhlIGZ1dHVyZSkuIFdoZW4gZHVtcCBpcyBjYWxsZWQsIHByaW50IGV2ZXJ5dGhpbmcgY3VycmVudGx5CisqICAgICBpbiB0aGUgYnVmZmVyLgogKiBOQkxvZzo6ZHJhd0hpc3RvZ3JhbQogKiAgICAgaW5wdXQ6IHRpbWVzdGFtcCBhcnJheQogKiAgICAgYnVja2V0cyB0aGlzIHRvIGEgaGlzdG9ncmFtIGFuZCBwcmludHMKQEAgLTgyLDcgKzg1LDcgQEAKICovCiAKICNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNsaW1pdHM+CkBAIC0xMDIsNiArMTA1LDcgQEAKICNpbmNsdWRlIDxuZXc+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oPgogLy8gI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPiAvLyB1c2VkIHRvIHByaW50IGNhbGxzdGFjawogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTEzNCw3ICsxMzgsNiBAQAogICAgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgogICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGb3JtYXRFbnRyeT4oRm9ybWF0RW50cnkocHRyKSk7Ci0gICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRkxVU0g6CiAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6CiAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKICAgICBkZWZhdWx0OgpAQCAtNTI4LDIxICs1MzEsNiBAQAogICAgIH0KIH0KIAotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dIaXN0Rmx1c2gobG9nX2hhc2hfdCBoYXNoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBIaXN0VHNFbnRyeSBkYXRhOwotICAgIGRhdGEuaGFzaCA9IGhhc2g7Ci0gICAgZGF0YS50cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKLSAgICBpZiAoZGF0YS50cyA+IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX0hJU1RPR1JBTV9GTFVTSCwgJmRhdGEsIHNpemVvZihkYXRhKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCiB2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKQogewogICAgIGlmICghbUVuYWJsZWQpIHsKQEAgLTc3MCwxNiArNzU4LDE0IEBACiBjb25zdCBzdGQ6OnNldDxOQkxvZzo6RXZlbnQ+IE5CTG9nOjpSZWFkZXI6OnN0YXJ0aW5nVHlwZXMge05CTG9nOjpFdmVudDo6RVZFTlRfU1RBUlRfRk1ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UU307CiBjb25zdCBzdGQ6OnNldDxOQkxvZzo6RXZlbnQ+IE5CTG9nOjpSZWFkZXI6OmVuZGluZ1R5cGVzICAge05CTG9nOjpFdmVudDo6RVZFTlRfRU5EX0ZNVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0ZMVVNIfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFN9OwogTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCiAgICAgOiBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwogICAgICAgbUZkKC0xKSwgbUluZGVudCgwKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CiAgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKICAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgZmluZEdsaXRjaChmYWxzZSkKKyAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCiB7CiB9CiAKQEAgLTc5NSwzOSArNzgxLDYgQEAKICAgICBkZWxldGUgbUZpZm87CiB9CiAKLWlubGluZSBzdGF0aWMgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7Ci0gICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKLX0KLQotLy8gUHJvZHVjZXMgYSBsb2cgd2FybmluZyBpZiB0aGUgdGltaW5nIG9mIHJlY2VudCBidWZmZXIgcGVyaW9kcyBjYXVzZWQgYSBnbGl0Y2gKLS8vIENvbXB1dGVzIHN1bSBvZiBydW5uaW5nIHdpbmRvdyBvZiB0aHJlZSBidWZmZXIgcGVyaW9kcwotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGJ1ZmZlciBwZXJpb2RzIGxlYXZlIGVub3VnaCBDUFUgdGltZSBmb3IgdGhlIG5leHQgb25lCi0vLyBlLmcuIGlmIGEgYnVmZmVyIHBlcmlvZCBpcyBleHBlY3RlZCB0byBiZSA0IG1zIGFuZCBhIGJ1ZmZlciByZXF1aXJlcyAzIG1zIG9mIENQVSB0aW1lLAotLy8gaGVyZSBhcmUgc29tZSBnbGl0Y2ggY2FzZXM6Ci0vLyA0ICsgNCArIDYgOyA1ICsgNCArIDU7IDIgKyAyICsgMTAKLS8vIFRPRE86IGRldmVsb3AgdGhpcyBjb2RlIHRvIHRyYWNrIGNoYW5nZXMgaW4gaGlzdG9ncmFtIGRpc3RyaWJ1dGlvbiBpbiBhZGRpdGlvbgotLy8gdG8gLyBpbnN0ZWFkIG9mIGdsaXRjaGVzCi12b2lkIE5CTG9nOjpSZWFkZXI6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKLSAgICAvL1RPRE86IG1lYXN1cmUga1BlcmlvZExlbiBhbmQga1JhdGlvIGZyb20gdGhlIGRhdGEgYXMgdGhleSBtYXkgY2hhbmdlLgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZExlbiA9IDQ7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtSYXRpbyA9IDAuNzU7IC8vIGVzdGltYXRlIG9mIENQVSB0aW1lIGFzIHJhdGlvIG9mIHBlcmlvZCBsZW5ndGgKLSAgICAvLyBEQUMgcHJvY2Vzc2luZyB0aW1lIGZvciA0IG1zIGJ1ZmZlcgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZFRpbWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kKGtQZXJpb2RMZW4gKiBrUmF0aW8pKTsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtOdW1CdWZmID0gMzsgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgY29uc2lkZXJlZCBpbiBsb2NhbCBoaXN0b3J5Ci0gICAgc3RkOjpkZXF1ZTxpbnQ+IHBlcmlvZHMoa051bUJ1ZmYsIGtQZXJpb2RMZW4pOwotICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgeyAvLyBza2lwIGZpcnN0IHRpbWUgZW50cnkKLSAgICAgICAgcGVyaW9kcy5wdXNoX2Zyb250KGRlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pKTsKLSAgICAgICAgcGVyaW9kcy5wb3BfYmFjaygpOwotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGFsbCBnbGl0Y2ggY2FzZXMgYXJlIGNvdmVyZWQKLSAgICAgICAgaWYgKHN0ZDo6YWNjdW11bGF0ZShwZXJpb2RzLmJlZ2luKCksIHBlcmlvZHMuZW5kKCksIDApID4ga051bUJ1ZmYgKiBrUGVyaW9kTGVuICsKLSAgICAgICAgICAgIGtQZXJpb2RMZW4gLSBrUGVyaW9kVGltZSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOwotICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTGVuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KIGNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7CiAgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CkBAIC05MzksMzMgKzg5MiwyMyBAQAogICAgIG9mcy5jbG9zZSgpOwogfQogCisvLyBjb252ZXJ0cyBhIHRpbWUgc2VyaWVzIGludG8gYSBtYXAuIGtleTogYnVmZmVyIHBlcmlvZCBsZW5ndGguIHZhbHVlOiBjb3VudAorc3RhdGljIHN0ZDo6bWFwPGludCwgaW50PiBidWlsZEJ1Y2tldHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKKyAgICAvLyBUT0RPIGFsbG93IGJ1Y2tldHMgb2YgdmFyaWFibGUgcmVzb2x1dGlvbgorICAgIHN0ZDo6bWFwPGludCwgaW50PiBidWNrZXRzOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgeworICAgICAgICArK2J1Y2tldHNbZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSldOworICAgIH0KKyAgICByZXR1cm4gYnVja2V0czsKK30KKwogdm9pZCBOQkxvZzo6UmVhZGVyOjpkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCwgTkJMb2c6OlJlYWRlcjo6U25hcHNob3QgJnNuYXBzaG90KQogewotICAvLyAgQ2FsbFN0YWNrIGNzKExPR19UQUcpOwotI2lmIDAKLSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0gICAgdGltZV90IG1heFNlYyA9IC0xOwotICAgIHdoaWxlIChlbnRyeSAtIHN0YXJ0ID49IChpbnQpIEVudHJ5OjprT3ZlcmhlYWQpIHsKLSAgICAgICAgaWYgKHByZXZFbnRyeSAtIHN0YXJ0IDwgMCB8fCAhcHJldkVudHJ5Lmhhc0NvbnNpc3RlbnRMZW5ndGgoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZXZFbnRyeS0+dHlwZSA9PSBFVkVOVF9USU1FU1RBTVApIHsKLSAgICAgICAgICAgIGlmIChwcmV2RW50cnktPmxlbmd0aCAhPSBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSkgewotICAgICAgICAgICAgICAgIC8vIGNvcnJ1cHQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZFbnRyeS5jb3B5RGF0YSgodWludDhfdCopICZ0cyk7Ci0gICAgICAgICAgICBpZiAodHMudHZfc2VjID4gbWF4U2VjKSB7Ci0gICAgICAgICAgICAgICAgbWF4U2VjID0gdHMudHZfc2VjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC0tZW50cnk7Ci0gICAgICAgIC0tcHJldkVudHJ5OwotICAgIH0KLSNlbmRpZgorICAgIC8vICBDYWxsU3RhY2sgY3MoTE9HX1RBRyk7CiAgICAgbUZkID0gZmQ7CiAgICAgbUluZGVudCA9IGluZGVudDsKICAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKyAgICBQZXJmb3JtYW5jZUFuYWx5c2lzIHBlcmZvcm1hbmNlQW5hbHl6ZXI7IC8vIHVzZWQgdG8gY2FsbCBhbmFseXNpcyBmdW5jdGlvbnMKICAgICBzaXplX3QgbG9zdCA9IHNuYXBzaG90Lmxvc3QoKSArIChzbmFwc2hvdC5iZWdpbigpIC0gRW50cnlJdGVyYXRvcihzbmFwc2hvdC5kYXRhKCkpKTsKICAgICBpZiAobG9zdCA+IDApIHsKICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IGxvc3QgJXp1IGJ5dGVzIHdvcnRoIG9mIGV2ZW50cyIsIGxvc3QpOwpAQCAtOTczLDg1ICs5MTYsOSBAQAogICAgICAgICAvLyAgICAgIGxvZyB0byBwdXNoIGl0IG91dC4gIENvbnNpZGVyIGtlZXBpbmcgdGhlIHRpbWVzdGFtcC9ib2R5IGJldHdlZW4gY2FsbHMgdG8gY29weUVudHJ5RGF0YUF0KCkuCiAgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CiAgICAgfQotI2lmIDAKLSAgICBzaXplX3Qgd2lkdGggPSAxOwotICAgIHdoaWxlIChtYXhTZWMgPj0gMTApIHsKLSAgICAgICAgKyt3aWR0aDsKLSAgICAgICAgbWF4U2VjIC89IDEwOwotICAgIH0KLSAgICBpZiAobWF4U2VjID49IDApIHsKLSAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyUqc10iLCAoaW50KSB3aWR0aCArIDQsICIiKTsKLSAgICB9Ci0gICAgYm9vbCBkZWZlcnJlZFRpbWVzdGFtcCA9IGZhbHNlOwotI2VuZGlmCiAKICAgICBmb3IgKGF1dG8gZW50cnkgPSBzbmFwc2hvdC5iZWdpbigpOyBlbnRyeSAhPSBzbmFwc2hvdC5lbmQoKTspIHsKICAgICAgICAgc3dpdGNoIChlbnRyeS0+dHlwZSkgewotI2lmIDAKLSAgICAgICAgY2FzZSBFVkVOVF9TVFJJTkc6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiJS4qcyIsIChpbnQpIGVudHJ5Lmxlbmd0aCgpLCBlbnRyeS5kYXRhKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfVElNRVNUQU1QOiB7Ci0gICAgICAgICAgICAvLyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBsZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYyk7Ci0gICAgICAgICAgICBlbnRyeS5jb3B5RGF0YSgoY29uc3QgdWludDhfdCopICZ0cyk7Ci0gICAgICAgICAgICBsb25nIHByZXZOc2VjID0gdHMudHZfbnNlYzsKLSAgICAgICAgICAgIGxvbmcgZGVsdGFNaW4gPSBMT05HX01BWDsKLSAgICAgICAgICAgIGxvbmcgZGVsdGFNYXggPSAtMTsKLSAgICAgICAgICAgIGxvbmcgZGVsdGFUb3RhbCA9IDA7Ci0gICAgICAgICAgICBhdXRvIGF1eChlbnRyeSk7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgKythdXg7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZCAtIGF1eCA+PSAwIHx8IGF1eC50eXBlKCkgIT0gRVZFTlRfVElNRVNUQU1QKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdHNOZXh0OwotICAgICAgICAgICAgICAgIGF1eC5jb3B5RGF0YSgoY29uc3QgdWludDhfdCopICZ0c05leHQpOwotICAgICAgICAgICAgICAgIGlmICh0c05leHQudHZfc2VjICE9IHRzLnR2X3NlYykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9uZyBkZWx0YSA9IHRzTmV4dC50dl9uc2VjIC0gcHJldk5zZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhIDwgZGVsdGFNaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGFNaW4gPSBkZWx0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gZGVsdGFNYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGFNYXggPSBkZWx0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVsdGFUb3RhbCArPSBkZWx0YTsKLSAgICAgICAgICAgICAgICBwcmV2TnNlYyA9IHRzTmV4dC50dl9uc2VjOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2l6ZV90IG4gPSAoYXV4IC0gZW50cnkpIC8gKHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpICsgMyAvKkVudHJ5OjprT3ZlcmhlYWQ/Ki8pOwotICAgICAgICAgICAgaWYgKGRlZmVycmVkVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICAgICAgICAgICAgICBkZWZlcnJlZFRpbWVzdGFtcCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAobiA+PSBrU3F1YXNoVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyVkLiUwM2QgdG8gLiUuMDNkIGJ5IC4lLjAzZCB0byAuJS4wM2RdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHRzLnR2X3NlYywgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMudHZfbnNlYyArIGRlbHRhVG90YWwpIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoZGVsdGFNaW4gLyAxMDAwMDAwKSwgKGludCkgKGRlbHRhTWF4IC8gMTAwMDAwMCkpOwotICAgICAgICAgICAgICAgIGVudHJ5ID0gYXV4OwotICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgdHMudHZfc2VjLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgIGRlZmVycmVkVGltZXN0YW1wID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX0lOVEVHRVI6Ci0gICAgICAgICAgICBhcHBlbmRJbnQoJmJvZHksIGVudHJ5LmRhdGEoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9GTE9BVDoKLSAgICAgICAgICAgIGFwcGVuZEZsb2F0KCZib2R5LCBlbnRyeS5kYXRhKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfUElEOgotICAgICAgICAgICAgYXBwZW5kUElEKCZib2R5LCBlbnRyeS5kYXRhKCksIGVudHJ5Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCiAgICAgICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgogICAgICAgICAgICAgZW50cnkgPSBoYW5kbGVGb3JtYXQoRm9ybWF0RW50cnkoZW50cnkpLCAmdGltZXN0YW1wLCAmYm9keSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTEwNjcsMzYgKzkzNCwyNSBAQAogICAgICAgICAgICAgLy8gVE9ETyBtaWdodCB3YW50IHRvIGZpbHRlciBleGNlc3NpdmVseSBoaWdoIG91dGxpZXJzLCB3aGljaCBhcmUgdXN1YWxseSBjYXVzZWQKICAgICAgICAgICAgIC8vIGJ5IHRoZSB0aHJlYWQgYmVpbmcgaW5hY3RpdmUuCiAgICAgICAgICAgICBtSGlzdHNba2V5XS5wdXNoX2JhY2sodHMpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRyYXdzIGhpc3RvZ3JhbXMgc3RvcmVkIGluIGdsb2JhbCBSZWFkZXI6Om1IaXN0cyBhbmQgZXJhc2VzIHRoZW0KLSAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRkxVU0g6IHsKLSAgICAgICAgICAgIEhpc3RvZ3JhbUVudHJ5IGhpc3RFbnRyeShlbnRyeSk7Ci0gICAgICAgICAgICAvLyBMb2cgdGltZXN0YW1wCi0gICAgICAgICAgICAvLyBUaW1lc3RhbXAgb2YgY2FsbCB0byBkcmF3SGlzdG9ncmFtLCBub3Qgd2hlbiBhdWRpbyB3YXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaGlzdEVudHJ5LnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotICAgICAgICAgICAgLy8gTG9nIGhpc3RvZ3JhbXMKLSAgICAgICAgICAgIHNldEZpbmRHbGl0Y2godHJ1ZSk7Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiSGlzdG9ncmFtIGZsdXNoIC0gIik7Ci0gICAgICAgICAgICBoYW5kbGVBdXRob3IoaGlzdEVudHJ5LCAmYm9keSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaGlzdCA9IG1IaXN0cy5iZWdpbigpOyBoaXN0ICE9IG1IaXN0cy5lbmQoKTspIHsKLSAgICAgICAgICAgICAgICBpZiAoaGlzdC0+Zmlyc3Quc2Vjb25kID09IGhpc3RFbnRyeS5hdXRob3IoKSkgewotICAgICAgICAgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiJVgiLCAoaW50KWhpc3QtPmZpcnN0LmZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRHbGl0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0SWZHbGl0Y2goaGlzdC0+c2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZmlsZSB0byBlbXB0eSBhbmQgd3JpdGUgZGF0YSBmb3IgYWxsIGhpc3RvZ3JhbXMgaW4gdGhpcyBzZXQKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVIaXN0VG9GaWxlKGhpc3QtPnNlY29uZCwgaGlzdCAhPSBtSGlzdHMuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdIaXN0b2dyYW0oJmJvZHksIGhpc3QtPnNlY29uZCwgdHJ1ZSwgaW5kZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaGlzdCA9IG1IaXN0cy5lcmFzZShoaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICArK2hpc3Q7CisgICAgICAgICAgICAvLyBzdG9yZSB0aW1lIHNlcmllcyBkYXRhIGZvciBlYWNoIHJlYWRlciBpbiBvcmRlciB0byBidWNrZXQgaXQgb25jZSB0aGVyZQorICAgICAgICAgICAgLy8gaXMgZW5vdWdoIGRhdGEuIFRoZW4sIGl0IGlzIHdyaXR0ZW4gdG8gcmVjZW50SGlzdHMgYXMgYSBoaXN0b2dyYW0uCisgICAgICAgICAgICBtVGltZVN0YW1wU2VyaWVzW2RhdGEtPmF1dGhvcl0ucHVzaF9iYWNrKHRzKTsKKyAgICAgICAgICAgIC8vIGlmIGxlbmd0aCBvZiB0aGUgdGltZSBzZXJpZXMgaGFzIHJlYWNoZWQga1Nob3J0SGlzdFNpemUgc2FtcGxlcywgZG8gMSkgYW5kIDIpOgorICAgICAgICAgICAgaWYgKG1UaW1lU3RhbXBTZXJpZXNbZGF0YS0+YXV0aG9yXS5zaXplKCkgPj0ga1Nob3J0SGlzdFNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyAxKSBhbmFseXplIHRoZSBzZXJpZXMgdG8gc3RvcmUgYWxsIG91dGxpZXJzIGFuZCB0aGVpciBleGFjdCB0aW1lc3RhbXBzOgorICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlQW5hbHl6ZXIuc3RvcmVPdXRsaWVyRGF0YShkYXRhLT5hdXRob3IsIG1UaW1lU3RhbXBTZXJpZXNbZGF0YS0+YXV0aG9yXSk7CisgICAgICAgICAgICAgICAgIC8vIDIpIGNvbXB1dGUgaXRzIGhpc3RvZ3JhbSwgYXBwZW5kIHRoaXMgdG8gbVJlY2VudEhpc3RzIGFuZCBlcmFzZSB0aGUgdGltZSBzZXJpZXMKKyAgICAgICAgICAgICAgICBtUmVjZW50SGlzdHMuZW1wbGFjZV9mcm9udChkYXRhLT5hdXRob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRCdWNrZXRzKG1UaW1lU3RhbXBTZXJpZXNbZGF0YS0+YXV0aG9yXSkpOworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBsZXQgbVJlY2VudEhpc3RzIGV4Y2VlZCBjYXBhY2l0eQorICAgICAgICAgICAgICAgIC8vIFRPRE86IHR1cm4gdGhlIEZJRk8gcXVldWUgaW50byBhIGNpcmN1bGFyIGJ1ZmZlcgorICAgICAgICAgICAgICAgIGlmIChtUmVjZW50SGlzdHMuc2l6ZSgpID49IGtSZWNlbnRIaXN0c0NhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIG1SZWNlbnRIaXN0cy5wb3BfYmFjaygpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wU2VyaWVzLmVyYXNlKGRhdGEtPmF1dGhvcik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGluIG1IaXN0cyBoYXMgbm90IGdyb3duIGZvciBhIGxvbmcgdGltZSwgZGVsZXRlCisgICAgICAgICAgICAvLyBUT0RPIGNvcHkgaGlzdG9ncmFtIGRhdGEgb25seSB0byBtUmVjZW50SGlzdHNCdWZmZXIgYW5kIHBvcCBvbGRlc3QKICAgICAgICAgICAgICsrZW50cnk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTExMCwxMSArOTY2LDEzIEBACiAgICAgICAgICAgICArK2VudHJ5OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwotICAgICAgICB9CiAgICAgfQorICAgIHBlcmZvcm1hbmNlQW5hbHl6ZXIucmVwb3J0UGVyZm9ybWFuY2UoJmJvZHksIG1SZWNlbnRIaXN0cyk7CisgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOworICAgIH0KKyAgICAvLyBjb21tZW50IGluIGZvciB0ZXN0cworICAgIC8vIHBlcmZvcm1hbmNlQW5hbHl6ZXIudGVzdEZ1bmN0aW9uKCk7CiB9CiAKIHZvaWQgTkJMb2c6OlJlYWRlcjo6ZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQpCkBAIC0xMTM5LDE2ICs5OTcsNiBAQAogICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKIH0KIAotdm9pZCBOQkxvZzo6UmVhZGVyOjpzZXRGaW5kR2xpdGNoKGJvb2wgcykKLXsKLSAgICBmaW5kR2xpdGNoID0gczsKLX0KLQotYm9vbCBOQkxvZzo6UmVhZGVyOjppc0ZpbmRHbGl0Y2goKSBjb25zdAotewotICAgIHJldHVybiBmaW5kR2xpdGNoOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBOQkxvZzo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKQEAgLTEyODMsMTI2ICsxMTMxLDYgQEAKICAgICByZXR1cm4gYXJnOwogfQogCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIHdoaWxlICh4ID4gMCkgewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0KLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLXN0YXRpYyBzdGQ6Om1hcDxpbnQsIGludD4gYnVpbGRCdWNrZXRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7Ci0gICAgLy8gVE9ETyBhbGxvdyBidWNrZXRzIG9mIHZhcmlhYmxlIHJlc29sdXRpb24KLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgKytidWNrZXRzW2RlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pXTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Y2tldHM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgbG9nMih1aW50MzJfdCB4KSB7Ci0gICAgLy8gVGhpcyB3b3JrcyBmb3IgeCA+IDAKLSAgICByZXR1cm4gMzEgLSBfX2J1aWx0aW5fY2x6KHgpOwotfQotCi0vLyBUT0RPIHB1dCB0aGlzIGZ1bmN0aW9uIGluIHNlcGFyYXRlIGZpbGUuIE1ha2UgaXQgcmV0dXJuIGEgc3RkOjpzdHJpbmcgaW5zdGVhZCBvZiBtb2RpZnlpbmcgYm9keQotLyoKLUV4YW1wbGUgb3V0cHV0OgotWzU0LjIzNF0gSGlzdG9ncmFtIGZsdXNoIC0gQXVkaW9PdXRfRDoKLUhpc3RvZ3JhbSAzMzY0MEJGMQotICAgICAgICAgICAgWyAxXVsgMV1bIDFdWyAzXVs1NF1bNjldWyAxXVsgMl1bIDFdCi0gICAgICAgIDY0fCAgICAgICAgICAgICAgICAgICAgICBbXQotICAgICAgICAzMnwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgMTZ8ICAgICAgICAgICAgICAgICAgW10gIFtdCi0gICAgICAgICA4fCAgICAgICAgICAgICAgICAgIFtdICBbXQotICAgICAgICAgNHwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgIDJ8X19fX19fX19fX19fX19bXV9fW11fX1tdX19fX19fW11fX19fCi0gICAgICAgICAgICAgIDQgICA1ICAgNiAgIDggICA5ICAxMCAgMTEgIDEzICAxNQotTm90aWNlIHRoYXQgYWxsIHZhbHVlcyB0aGF0IGZhbGwgaW4gdGhlIHNhbWUgcm93IGhhdmUgdGhlIHNhbWUgaGVpZ2h0ICg2NSBhbmQgMTI3IGFyZSBkaXNwbGF5ZWQKLWlkZW50aWNhbGx5KS4gVGhhdCdzIHdoeSBleGFjdCBjb3VudHMgYXJlIGFkZGVkIGF0IHRoZSB0b3AuCi0qLwotdm9pZCBOQkxvZzo6UmVhZGVyOjpkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQpIHsKLSAgICAvLyB0aGlzIGF2b2lkcyBzb21lIGNvcm5lciBjYXNlcwotICAgIGlmIChzYW1wbGVzLnNpemUoKSA8PSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gdGVtcCBjb2RlIGZvciBkZWJ1Z2dpbmcgdGhlIG91dGxpZXIgdGltZXN0YW1wCi0gICAgY29uc3QgaW50IGtNYXhNcyA9IDEwMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpLTE7ICsraSkgewotICAgICAgICBjb25zdCBpbnQgY3VyckRlbHRhID0gZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSk7Ci0gICAgICAgIGlmIChjdXJyRGVsdGEgPiBrTWF4TXMpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG5sb2NhdGlvbjogJXp1LCBzaXplOiAlenUsIHBvcyBmcm9tIGVuZDogJXp1LCAlZFx0IiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMuc2l6ZSgpLCBzYW1wbGVzLnNpemUoKSAtIGksIGN1cnJEZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklYTUU6IGFzIGNhbiBiZSBzZWVuIHdoZW4gcHJpbnRpbmcgdGhlIHZhbHVlcywgdGhlIG91dGxpZXIgdGltZXN0YW1wcyB0eXBpY2FsbHkgb2NjdXIKLSAgICAvLyBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIDM1IHRvIDM4IGluZGljZXMgZnJvbSB0aGUgZW5kIChtb3N0IG9mdGVuIDM1KS4KLSAgICAvLyBUT0RPOiBidWlsZCBoaXN0b2dyYW0gYnVja2V0cyBlYXJsaWVyIGFuZCBkaXNjYXJkIHRpbWVzdGFtcHMgdG8gc2F2ZSBtZW1vcnkKLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0cyA9IGJ1aWxkQnVja2V0cyhzYW1wbGVzKTsKLSAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIGFsbCBpbnRzIHRvIHVpbnQzMl90IG9yIHVpbnQ2NF90Ci0KLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICctJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2dTY2FsZSA/IGxvZzIobWF4Q291bnQpICsgMSA6IG1heENvdW50OyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCi0gICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZihsb2dTY2FsZSA/IHBvdygyLCBoZWlnaHQpIDogbWF4Q291bnQpOwotICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2YobWF4RGVsdGEpICsgMSwgMyksIGxlZnRQYWRkaW5nICsgMik7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGxlZnRQYWRkaW5nICsgMTEsICJPY2N1cnJlbmNlcyIpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IGxvZ1NjYWxlID8gKDEgPDwgcm93KSA6IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLQotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOwotfQotCiBOQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CiAgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCBiL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Yjc2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2RlZmluZSBMT0dfVEFHICJQZXJmb3JtYW5jZUFuYWx5c2lzIgorLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisvLyAjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+IC8vIHVzZWQgdG8gcHJpbnQgY2FsbHN0YWNrCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitQZXJmb3JtYW5jZUFuYWx5c2lzOjpQZXJmb3JtYW5jZUFuYWx5c2lzKCkgOiBmaW5kR2xpdGNoKGZhbHNlKSB7CisgICAga1BlcmlvZE1zQ1BVID0gc3RhdGljX2Nhc3Q8aW50PihQZXJmb3JtYW5jZUFuYWx5c2lzOjprUGVyaW9kTXMgKiBrUmF0aW8pOworfQorCitzdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKKyAgICBpbnQgd2lkdGggPSAwOworICAgIHdoaWxlICh4ID4gMCkgeworICAgICAgICArK3dpZHRoOworICAgICAgICB4IC89IDEwOworICAgIH0KKyAgICByZXR1cm4gd2lkdGg7Cit9CisKKy8vIEZJWE1FOiBkZWxldGUgdGhpcyB0ZW1wb3JhcnkgdGVzdCBjb2RlLCByZWN5Y2xlZCBmb3IgdmFyaW91cyBuZXcgZnVuY3Rpb25zCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnRlc3RGdW5jdGlvbigpIHsKKyAgICAvLyBwcm9kdWNlcyB2YWx1ZXMgKDQ6IDUwMDAwMDApLCAoMTM6IDE4MDAwMDAwKQorICAgIC8vIG5zIHRpbWVzdGFtcHMgb2YgYnVmZmVyIHBlcmlvZHMKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PmtUZW1wVGVzdERhdGEgPSB7MTAwMDAwMCwgNDAwMDAwMCwgNTAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAwMDAsIDE4MDAwMDAwLCAyODAwMDAwMH07CisgICAgY29uc3QgaW50IGtUZXN0QXV0aG9yID0gMTsKKyAgICBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhKGtUZXN0QXV0aG9yLCBrVGVtcFRlc3REYXRhKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXI6IG1PdXRsaWVyRGF0YSkgeworICAgICAgICBBTE9HRSgiUGVyZm9ybWFuY2VBbmFseXNpcyB0ZXN0ICVsbGQ6ICVsbGQiLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuZmlyc3QpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuc2Vjb25kKSk7CisgICAgfQorfQorCisvLyBFYWNoIHBhaXIgY29uc2lzdHMgb2Y6IDxvdXRsaWVyIHRpbWVzdGFtcCwgdGltZSBlbGFwc2VkIHNpbmNlIHByZXZpb3VzIG91dGxpZXI+LgorLy8gVGhlIHRpbWVzdGFtcCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRsaWVyIGlzIHJlY29yZGVkLgorLy8gVGhlIGVsYXBzZWQgdGltZSBpcyBmcm9tIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHByZXZpb3VzIG91dGxpZXIKKy8vIGUuZy4gdGltZXN0YW1wcyAobXMpIDEsIDQsIDUsIDE2LCAxOCwgMjggd2lsbCBwcm9kdWNlIHBhaXJzICg0LCA1KSwgKDEzLCAxOCkuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIHRpbWUgc2VyaWVzIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQgaW50byBhIGhpc3RvZ3JhbS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YSgKKyAgICBpbnQgYXV0aG9yLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmdGltZXN0YW1wcykgeworICAgIGlmICh0aW1lc3RhbXBzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgQUxPR0UoInN0b3JlT3V0bGllckRhdGEgY2FsbGVkIG9uIGVtcHR5IHZlY3RvciIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dGhvcisrOyAvLyB0ZW1wIHRvIGF2b2lkIHVudXNlZCBlcnJvciB1bnRpbCB0aGlzIHZhbHVlIGlzCisgICAgLy8gZWl0aGVyIFRPRE86IHVzZWQgb3IgZGlzY2FyZGVkIGZyb20gdGhlIGFyZ2xpc3QKKyAgICBhdXRob3ItLTsKKyAgICB1aW50NjRfdCBlbGFwc2VkID0gMDsKKyAgICBpbnQ2NF90IHByZXYgPSB0aW1lc3RhbXBzLmF0KDApOworICAgIGZvciAoY29uc3QgYXV0byAmdHM6IHRpbWVzdGFtcHMpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgZGlmZiA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihkZWx0YU1zKHByZXYsIHRzKSk7CisgICAgICAgIGlmIChkaWZmID49IHN0YXRpY19jYXN0PHVpbnQ2NF90PihrT3V0bGllck1zKSkgeworICAgICAgICAgICAgbU91dGxpZXJEYXRhLmVtcGxhY2VfYmFjayhlbGFwc2VkLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocHJldikpOworICAgICAgICAgICAgZWxhcHNlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxhcHNlZCArPSBkaWZmOworICAgICAgICBwcmV2ID0gdHM7CisgICAgfQorICAgIC8vIEFMT0dFKCJzdG9yZU91dGxpZXJEYXRhOiByZXN1bHQgbGVuZ3RoICV6dSIsIG91dGxpZXJEYXRhLnNpemUoKSk7CisgICAgLy8gZm9yIChjb25zdCBhdXRvICZvdXRsaWVyOiBPdXRsaWVyRGF0YSkgeworICAgIC8vICAgIEFMT0dFKCJQZXJmb3JtYW5jZUFuYWx5c2lzIHRlc3QgJWxsZDogJWxsZCIsCisgICAgLy8gICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLmZpcnN0KSwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLnNlY29uZCkpOworICAgIC8vfQorfQorCisvLyBUT0RPOiBpbXBsZW1lbnQgcGVhayBkZXRlY3RvcgorLyoKKyAgc3RhdGljIHZvaWQgcGVha0RldGVjdG9yKCkgeworICByZXR1cm47CisgIH0gKi8KKworLy8gVE9ETyBwdXQgdGhpcyBmdW5jdGlvbiBpbiBzZXBhcmF0ZSBmaWxlLiBNYWtlIGl0IHJldHVybiBhIHN0ZDo6c3RyaW5nIGluc3RlYWQgb2YgbW9kaWZ5aW5nIGJvZHkKKy8vIFRPRE8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YgUmVhZGVyIGZvciB0aGlzIGFuZCByZWxhdGVkIHdvcmsKKy8vIEZJWE1FOiBhcyBjYW4gYmUgc2VlbiB3aGVuIHByaW50aW5nIHRoZSB2YWx1ZXMsIHRoZSBvdXRsaWVyIHRpbWVzdGFtcHMgdHlwaWNhbGx5IG9jY3VyCisvLyBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIDM1IHRvIDM4IGluZGljZXMgZnJvbSB0aGUgZW5kIChtb3N0IG9mdGVuIDM1KS4KKy8vIFRPRE86IGJ1aWxkIGhpc3RvZ3JhbSBidWNrZXRzIGVhcmxpZXIgYW5kIGRpc2NhcmQgdGltZXN0YW1wcyB0byBzYXZlIG1lbW9yeQorLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyBhbGwgaW50cyB0byB1aW50MzJfdCBvciB1aW50NjRfdAordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpyZXBvcnRQZXJmb3JtYW5jZShTdHJpbmc4ICpib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW50LCBzaG9ydF9oaXN0b2dyYW0+PiAmc2hvcnRIaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEhlaWdodCkgeworICAgIGlmIChzaG9ydEhpc3RzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyB0aGlzIGlzIHRlbXBvcmFyeSBjb2RlLCB3aGljaCBvbmx5IHByaW50cyBvdXQgb25lIGhpc3RvZ3JhbQorICAgIC8vIG9mIGFsbCBkYXRhIHN0b3JlZCBpbiBidWZmZXIuIFRoZSBkYXRhIGlzIG5vdCBlcmFzZWQsIG9ubHkgb3ZlcndyaXR0ZW4uCisgICAgLy8gVE9ETzogbW9yZSBlbGFib3JhdGUgZGF0YSBhbmFseXNpcworICAgIHN0ZDo6bWFwPGludCwgaW50PiBidWNrZXRzOworICAgIGZvciAoY29uc3QgYXV0byAmc2hvcnRIaXN0OiBzaG9ydEhpc3RzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY291bnRQYWlyIDogc2hvcnRIaXN0LnNlY29uZCkgeworICAgICAgICAgICAgYnVja2V0c1tjb3VudFBhaXIuZmlyc3RdICs9IGNvdW50UGFpci5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQorICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOworICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7CisgICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7CisKKyAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOworICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKKyAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKKyAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgeworICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgeworICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKKyAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgY29sV2lkdGggPSBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKG1heERlbHRhKSArIDEsIDMpLCBsZWZ0UGFkZGluZyArIDIpOworICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKKyAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKKyAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7CisgICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKKyAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBsZWZ0UGFkZGluZyArIDExLCAiT2NjdXJyZW5jZXMiKTsKKyAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7CisgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7CisgICAgfQorICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgeworICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKKyAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICB9CisgICAgLy8gcHJpbnQgeC1heGlzCisgICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKworICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOworICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOworCisgICAgLy8gTm93IHJlcG9ydCBnbGl0Y2hlcworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG50aW1lIGVsYXBzZWQgYmV0d2VlbiBnbGl0Y2hlcyBhbmQgZ2xpdGNoIHRpbWVzdGFtcHNcbiIpOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllcjogbU91dGxpZXJEYXRhKSB7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJWxsZDogJWxsZFxuIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5zZWNvbmQpKTsKKyAgICB9CisKK30KKworCisvLyBQcm9kdWNlcyBhIGxvZyB3YXJuaW5nIGlmIHRoZSB0aW1pbmcgb2YgcmVjZW50IGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBhIGdsaXRjaAorLy8gQ29tcHV0ZXMgc3VtIG9mIHJ1bm5pbmcgd2luZG93IG9mIHRocmVlIGJ1ZmZlciBwZXJpb2RzCisvLyBDaGVja3Mgd2hldGhlciB0aGUgYnVmZmVyIHBlcmlvZHMgbGVhdmUgZW5vdWdoIENQVSB0aW1lIGZvciB0aGUgbmV4dCBvbmUKKy8vIGUuZy4gaWYgYSBidWZmZXIgcGVyaW9kIGlzIGV4cGVjdGVkIHRvIGJlIDQgbXMgYW5kIGEgYnVmZmVyIHJlcXVpcmVzIDMgbXMgb2YgQ1BVIHRpbWUsCisvLyBoZXJlIGFyZSBzb21lIGdsaXRjaCBjYXNlczoKKy8vIDQgKyA0ICsgNiA7IDUgKyA0ICsgNTsgMiArIDIgKyAxMAorLy8gVE9ETzogZGV2ZWxvcCB0aGlzIGNvZGUgdG8gdHJhY2sgY2hhbmdlcyBpbiBoaXN0b2dyYW0gZGlzdHJpYnV0aW9uIGluIGFkZGl0aW9uCisvLyB0byAvIGluc3RlYWQgb2YgZ2xpdGNoZXMuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKKyAgICBzdGQ6OmRlcXVlPGludD4gcGVyaW9kcyhrTnVtQnVmZiwga1BlcmlvZE1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsgLy8gc2tpcCBmaXJzdCB0aW1lIGVudHJ5CisgICAgICAgIHBlcmlvZHMucHVzaF9mcm9udChkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKSk7CisgICAgICAgIHBlcmlvZHMucG9wX2JhY2soKTsKKyAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCBhbGwgZ2xpdGNoIGNhc2VzIGFyZSBjb3ZlcmVkCisgICAgICAgIGlmIChzdGQ6OmFjY3VtdWxhdGUocGVyaW9kcy5iZWdpbigpLCBwZXJpb2RzLmVuZCgpLCAwKSA+IGtOdW1CdWZmICoga1BlcmlvZE1zICsKKyAgICAgICAgICAgIGtQZXJpb2RNcyAtIGtQZXJpb2RNc0NQVSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOworICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworYm9vbCBQZXJmb3JtYW5jZUFuYWx5c2lzOjppc0ZpbmRHbGl0Y2goKSBjb25zdAoreworICAgIHJldHVybiBmaW5kR2xpdGNoOworfQorCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnNldEZpbmRHbGl0Y2goYm9vbCBzKQoreworICAgIGZpbmRHbGl0Y2ggPSBzOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCmluZGV4IDQ3NDdkY2YuLjcxMTgyYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCkBAIC0xOSw4ICsxOSw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fQlVGRkVSX1BST1ZJREVSX1NPVVJDRV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fQlVGRkVSX1BST1ZJREVSX1NPVVJDRV9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9TdHJlYW1JblNvdXJjZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCmluZGV4IDUwOGUwZmUuLjhhM2ZmYmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9TdHJlYW1JblNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fU1RSRUFNX0lOX1NPVVJDRV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fU1RSRUFNX0lOX1NPVVJDRV9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbU91dFNpbmsuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbU91dFNpbmsuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAppbmRleCA1NmEyYTM4Li4zNDhiNGY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19TVFJFQU1fT1VUX1NJTktfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfU0lOS19ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNpbmsuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCmluZGV4IDk3YTU3ZTAuLjUzNWUzZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNpbmsuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKQEAgLTE3LDcgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19MSUJTTkRGSUxFX1NJTktfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU0lOS19ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CisKICNpbmNsdWRlICJzbmRmaWxlLmgiCiAKIC8vIEltcGxlbWVudGF0aW9uIG9mIE5CQUlPX1NpbmsgdGhhdCB3cmFwcyBhIGxpYnNuZGZpbGUgb3BlbmVkIGluIFNGTV9XUklURSBtb2RlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0xpYnNuZGZpbGVTb3VyY2UuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaAppbmRleCA0ZmJkYjRiLi5iYzZhYTlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0xpYnNuZGZpbGVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApAQCAtMTcsNyArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19MSUJTTkRGSUxFX1NPVVJDRV9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CisKICNpbmNsdWRlICJzbmRmaWxlLmgiCiAKIC8vIEltcGxlbWVudGF0aW9uIG9mIE5CQUlPX1NvdXJjZSB0aGF0IHdyYXBzIGEgbGlic25kZmlsZSBvcGVuZWQgaW4gU0ZNX1JFQUQgbW9kZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTkJMb2cuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCmluZGV4IDc4NWI5YzIuLjZiMDhlOTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTkJMb2cuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTU5LDcgKzYwLDYgQEAKICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgogICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KLSAgICBFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICAgICAgLy8gc2hvdyBoaXN0b2dyYW0gb24gbG9nCiAgICAgRVZFTlRfRU5EX0ZNVCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAogCiAgICAgRVZFTlRfVVBQRVJfQk9VTkQsICAgICAgICAgIC8vIHRvIGNoZWNrIGZvciBpbnZhbGlkIGV2ZW50cwpAQCAtMzQyLDcgKzM0Miw2IEBACiAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7CiAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0hpc3RUUyhsb2dfaGFzaF90IGhhc2gpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIaXN0Rmx1c2gobG9nX2hhc2hfdCBoYXNoKTsKIAogICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKIApAQCAtNDQzLDggKzQ0Miw2IEBACiAKICAgICB2aXJ0dWFsIH5SZWFkZXIoKTsKIAotICAgIHZvaWQgYWxlcnRJZkdsaXRjaChjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcyk7Ci0KICAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KCk7CiAgICAgLy8gZHVtcCBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgpAQCAtNDUyLDExICs0NDksMTIgQEAKICAgICAvLyBkdW1wIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciAoY2FsbCBnZXRTbmFwc2hvdCgpIGFuZCBwcmV2aW91cyBkdW1wKCkpCiAgICAgdm9pZCAgICAgZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQgPSAwKTsKICAgICBib29sICAgICBpc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0OwotICAgIC8vIGlmIGZpbmRHbGl0Y2ggaXMgdHJ1ZSwgbG9nIHdhcm5pbmcgd2hlbiBidWZmZXIgcGVyaW9kcyBjYXVzZWQgZ2xpdGNoCi0gICAgdm9pZCAgICAgc2V0RmluZEdsaXRjaChib29sIHMpOwotICAgIGJvb2wgICAgIGlzRmluZEdsaXRjaCgpIGNvbnN0OwogCiBwcml2YXRlOgorCisgICAgLy8gVE9ETzogZGVjaWRlIHdoZXRoZXIgdGhlc2UgYmVsb25nIGluIE5CTG9nOjpSZWFkZXIgb3IgaW4gUGVyZm9ybWFuY2VBbmFseXNpcworICAgIHN0YXRpYyBjb25zdCBpbnQga1Nob3J0SGlzdFNpemUgPSA1MDsgLy8gbnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBzaG9ydC10ZXJtIGhpc3RvZ3JhbQorICAgIHN0YXRpYyBjb25zdCBpbnQga1JlY2VudEhpc3RzQ2FwYWNpdHkgPSAxMDA7IC8vIG51bWJlciBvZiBzaG9ydC10ZXJtIGhpc3RvZ3JhbXMgc3RvcmVkIGluIG1lbW9yeQogICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gc3RhcnRpbmdUeXBlczsKICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IGVuZGluZ1R5cGVzOwogICAgIC8qY29uc3QqLyBTaGFyZWQqIGNvbnN0IG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnksIGFjdHVhbGx5IGNvbnN0IGJ1dCBub3QKQEAgLTQ2OSwxMCArNDY3LDIzIEBACiAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKIAorICAgIC8vIHN0b3JlcyBhIHNob3J0LXRlcm0gaGlzdG9ncmFtIG9mIHNpemUgZGV0ZXJtaW5lZCBieSBrU2hvcnRIaXN0U2l6ZQorICAgIC8vIFRPRE86IHVuc2lnbmVkLCB1bnNpZ25lZAorICAgIHVzaW5nIHNob3J0X2hpc3RvZ3JhbSA9IHN0ZDo6bWFwPGludCwgaW50PjsKKwogICAgIC8vIGVhY2ggcGFpciBjb250YWlucyBhIHNlcXVlbmNlIG9mIHRpbWVzdGFtcHMgKG9uZSBoaXN0b2dyYW0ncyB3b3J0aCkKICAgICAvLyBwYWlyJ3MgbG9nX2hhc2hfdCBpcyB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRpbWVzdGFtcCB3YXMgdGFrZW4KICAgICAvLyBwYWlyJ3MgaW50IHBvaW50cyB0byB0aGUgUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKICAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8bG9nX2hhc2hfdCwgaW50Piwgc3RkOjp2ZWN0b3I8aW50NjRfdD4+IG1IaXN0czsKKworICAgIC8vIG1IaXN0c0NvcHkgc3RvcmVzIHRpbWVzdGFtcCB2ZWN0b3JzIHdob3NlIGtleSBpcyB0aGUgcmVhZGVyIHRocmVhZCBpbmRleC4KKyAgICAvLyBUT0RPIHJlbW92ZSBvbGQgbUhpc3RzIGFmdGVyIGNoYW5naW5nIHRoZSBjb2RlCisgICAgc3RkOjptYXA8aW50LCBzdGQ6OnZlY3RvcjxpbnQ2NF90Pj4gbVRpbWVTdGFtcFNlcmllczsKKworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIHNob3J0IGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIGhhc2ggYW5kIHRocmVhZCBkYXRhCisgICAgLy8gVE9ETzogVHVybiBpdCBpbnRvIGEgY2lyY3VsYXIgYnVmZmVyIGZvciBiZXR0ZXIgZGF0YSBmbG93CisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8aW50LCBzaG9ydF9oaXN0b2dyYW0+PiBtUmVjZW50SGlzdHM7CisKICAgICAvLyBUT0RPOiBpdCBtaWdodCBiZSBjbGVhcmVyLCBpbnN0ZWFkIG9mIGEgZGlyZWN0IG1hcCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byB2ZWN0b3Igb2YKICAgICAvLyB0aW1lc3RhbXBzLCBpZiB3ZSBpbnN0ZWFkIGZpcnN0IG1hcHBlZCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byBhbiBvYmplY3QgdGhhdAogICAgIC8vIHJlcHJlc2VudGVkIHRoYXQgbG9jYXRpb24uIEFuZCBvbmVfb2YgaXRzIGZpZWxkcyB3b3VsZCBiZSBhIHZlY3RvciBvZiB0aW1lc3RhbXBzLgpAQCAtNDg1LDE3ICs0OTYsMTIgQEAKICAgICAvLyBkdW1teSBtZXRob2QgZm9yIGhhbmRsaW5nIGFic2VudCBhdXRob3IgZW50cnkKICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9CiAKLSAgICBzdGF0aWMgdm9pZCBkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwgaW50IGluZGVudCA9IDAsIGludCBtYXhIZWlnaHQgPSAxMCk7Ci0KICAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgZW50cnkgb2YgdHlwZSA8dHlwZT4gaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKICAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCi0KLSAgICBib29sIGZpbmRHbGl0Y2g7IC8vIGFsZXJ0IGlmIGEgbG9jYWwgYnVmZmVyIHBlcmlvZCBzZXF1ZW5jZSBjYXVzZWQgYW4gYXVkaW8gZ2xpdGNoCiB9OwogCiAvLyBXcmFwcGVyIGZvciBhIHJlYWRlciB3aXRoIGEgbmFtZS4gQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSByZWFkZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmFtZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFlMzhiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBOb24tYmxvY2tpbmcgZXZlbnQgbG9nZ2VyIGludGVuZGVkIGZvciBzYWZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgdmlhIHNoYXJlZCBtZW1vcnkKKworI2lmbmRlZiBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCitjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzIHsKKworcHVibGljOgorCitQZXJmb3JtYW5jZUFuYWx5c2lzKCk7CisKKy8vIHN0b3JlcyBhIHNob3J0LXRlcm0gaGlzdG9ncmFtIG9mIHNpemUgZGV0ZXJtaW5lZCBieSBrU2hvcnRIaXN0U2l6ZQorLy8gVE9ETzogdW5zaWduZWQsIHVuc2lnbmVkCisvLyBDSEVDSzogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIHVzZSBzaG9ydF9oaXN0b2dyYW0gdGhhbiB0byB3cml0ZSAndXNpbmcnCisvLyBib3RoIGluIHRoaXMgaGVhZGVyIGZpbGUgYW5kIGluIE5CTG9nLmg/Cit1c2luZyBzaG9ydF9oaXN0b2dyYW0gPSBzdGQ6Om1hcDxpbnQsIGludD47CisKKy8vIHJldHVybnMgYSB2ZWN0b3Igb2YgcGFpcnMgPG91dGxpZXIgdGltZXN0YW1wLCB0aW1lIGVsYXBzZWQgc2luY2UgcHJldmlvdXMgb3V0bGllcgorLy8gY2FsbGVkIGJ5IE5CTG9nOjpSZWFkZXI6OmR1bXAgYmVmb3JlIGRhdGEgaXMgY29udmVydGVkIGludG8gaGlzdG9ncmFtCisvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBlbGFwc2VkIHRpbWUKKy8vIFRoZSByZXNvbHV0aW9uIGlzIG9ubHkgYXMgZ29vZCBhcyB0aGUgbXMgZHVyYXRpb24gb2Ygb25lIHNob3J0SGlzdAordm9pZCBzdG9yZU91dGxpZXJEYXRhKGludCBhdXRob3IsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZ0aW1lc3RhbXBzKTsKKworLy8gVE9ETzogZGVsZXRlIHRoaXMuIHRlbXAgZm9yIHRlc3RpbmcKK3ZvaWQgdGVzdEZ1bmN0aW9uKCk7CisKKy8vIEdpdmVuIGEgc2VyaWVzLCBsb29rcyBmb3IgY2hhbmdlcyBpbiBkaXN0cmlidXRpb24gKHBlYWtzKQorLy8gUmV0dXJucyBhICdzaWduYWwnIGFycmF5IG9mIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2VyaWVzLCB3aGVyZSBlYWNoCisvLyB2YWx1ZSBpcyBtYXBwZWQgdG8gLTEsIDAsIG9yIDEgYmFzZWQgb24gd2hldGhlciBhIG5lZ2F0aXZlIG9yIHBvc2l0aXZlIHBlYWsKKy8vIHdhcyBkZXRlY3RlZCwgb3Igbm8gc2lnbmlmaWNhbnQgY2hhbmdlIG9jY3VycmVkLgorLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIG1lYW4gdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCBzaWdtYSB0byAwLCBhbmQgdXBkYXRlcworLy8gdGhlbSBhcyBsb25nIGFzIG5vIHBlYWsgaXMgZGV0ZWN0ZWQuIFdoZW4gYSB2YWx1ZSBpcyBtb3JlIHRoYW4gJ3RocmVzaG9sZCcKKy8vIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiwgYSBwZWFrIGlzIGRldGVjdGVkIGFuZCB0aGUgbWVhbiBhbmQgc2lnbWEKKy8vIGFyZSBzZXQgdG8gdGhlIHBlYWsgdmFsdWUgYW5kIDAuCisvLyBzdGF0aWMgdm9pZCBwZWFrRGV0ZWN0b3IoKTsKKworLy8gaW5wdXQ6IHNlcmllcyBvZiBzaG9ydCBoaXN0b2dyYW1zLiBvdXRwdXQ6IHByaW50cyBhbiBhbmFseXNpcyBvZiB0aGUKKy8vIGRhdGEgdG8gdGhlIGNvbnNvbGUKKy8vIFRPRE86IGNoYW5nZSB0aGlzIHNvIHRoYXQgaXQgd3JpdGVzIHRoZSBhbmFseXNpcyB0byB0aGUgbG9uZy10ZXJtCisvLyBjaXJjdWxhciBidWZmZXIgYW5kIHByaW50cyBhbiBhbmFseXNlcyBib3RoIGZvciB0aGUgc2hvcnQgYW5kIGxvbmctdGVybQordm9pZCByZXBvcnRQZXJmb3JtYW5jZShTdHJpbmc4ICpib2R5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcgorICAgICAgICAgICAgICAgICAgICAgICA8aW50LCBzaG9ydF9oaXN0b2dyYW0+PiAmc2hvcnRIaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEhlaWdodCA9IDEwKTsKKworLy8gaWYgZmluZEdsaXRjaCBpcyB0cnVlLCBsb2cgd2FybmluZyB3aGVuIGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBnbGl0Y2gKKy8vIFRPRE8gYWRhcHQgdGhpcyB0byB0aGUgYW5hbHlzaXMgaW4gcmVwb3J0UGVyZm9ybWFuY2UgaW5zdGVhZCBvZiBsb2dnaW5nCit2b2lkICAgICBhbGVydElmR2xpdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKTsKK2Jvb2wgICAgIGlzRmluZEdsaXRjaCgpIGNvbnN0Owordm9pZCAgICAgc2V0RmluZEdsaXRjaChib29sIHMpOworCit+UGVyZm9ybWFuY2VBbmFseXNpcygpIHt9CisKK3ByaXZhdGU6CisKKy8vIHN0b3JlcyBvdXRsaWVyIGFuYWx5c2lzCitzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90Pj4gbU91dGxpZXJEYXRhOworCisvLyBzdG9yZXMgbG9uZy10ZXJtIGF1ZGlvIHBlcmZvcm1hbmNlIGRhdGEKKy8vIFRPRE86IFR1cm4gaXQgaW50byBhIGNpcmN1bGFyIGJ1ZmZlcgorc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8aW50LCBpbnQ+PiBtUGVyZm9ybWFuY2VBbmFseXNpczsKKworLy8gYWxlcnQgaWYgYSBsb2NhbCBidWZmZXIgcGVyaW9kIHNlcXVlbmNlIGNhdXNlZCBhbiBhdWRpbyBnbGl0Y2gKK2Jvb2wgZmluZEdsaXRjaDsKKy8vVE9ETzogbWVhc3VyZSB0aGVzZSBmcm9tIHRoZSBkYXRhIChlLmcuLCBtb2RlKSBhcyB0aGV5IG1heSBjaGFuZ2UuCisvL2NvbnN0IGludCBrR2xpdGNoVGhyZXNoTXMgPSA3OworLy8gY29uc3QgaW50IGtNc1BlclNlYyA9IDEwMDA7Citjb25zdCBpbnQga051bUJ1ZmYgPSAzOyAvLyBudW1iZXIgb2YgYnVmZmVycyBjb25zaWRlcmVkIGluIGxvY2FsIGhpc3RvcnkKK2NvbnN0IGludCBrUGVyaW9kTXMgPSA0OyAvLyBjdXJyZW50IHBlcmlvZCBsZW5ndGggaXMgaWRlYWxseSA0IG1zCitjb25zdCBpbnQga091dGxpZXJNcyA9IDc7IC8vIHZhbHVlcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgY2F1c2UgZ2xpdGNoZXMgZXZlcnkgdGltZQorLy8gREFDIHByb2Nlc3NpbmcgdGltZSBmb3IgNCBtcyBidWZmZXIKK3N0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtSYXRpbyA9IDAuNzU7IC8vIGVzdGltYXRlIG9mIENQVSB0aW1lIGFzIHJhdGlvIG9mIHBlcmlvZCBsZW5ndGgKK2ludCBrUGVyaW9kTXNDUFU7IC8vY29tcHV0ZSBiYXNlZCBvbiBrUGVyaW9kTGVuIGFuZCBrUmF0aW8KKworfTsKKworc3RhdGljIGlubGluZSBpbnQgZGVsdGFNcyhpbnQ2NF90IG5zMSwgaW50NjRfdCBuczIpIHsKKyAgICByZXR1cm4gKG5zMiAtIG5zMSkgLyAoMTAwMCAqIDEwMDApOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGxvZzIodWludDMyX3QgeCkgeworICAgIC8vIFRoaXMgd29ya3MgZm9yIHggPiAwCisgICAgcmV0dXJuIDMxIC0gX19idWlsdGluX2Nseih4KTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9QaXBlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCmluZGV4IDU4Yjk3NTAuLjA0MzE5NzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fUElQRV9ICiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+Ci0jaW5jbHVkZSAiTkJBSU8uaCIKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZVJlYWRlci5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZVJlYWRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKaW5kZXggYWU0OTkwMy4uY2MyZDAxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKQEAgLTE5LDcgKzE5LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TT1VSQ0VfQVVESU9fQlVGRkVSX1BST1ZJREVSX0gKICNkZWZpbmUgQU5EUk9JRF9TT1VSQ0VfQVVESU9fQlVGRkVSX1BST1ZJREVSX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZS5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGUuaAppbmRleCA2MGFlOTJlLi5jNTFkMGZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL01vbm9QaXBlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgogI2luY2x1ZGUgPG1lZGlhL1NpbmdsZVN0YXRlUXVldWUuaD4KLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZVJlYWRlci5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGVSZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTkJBSU8uaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9OQkFJTy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL05CQUlPLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9OQkFJTy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCmluZGV4IDBkOTY5NmYuLjNjN2FlM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxudW1lcmljPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMzQsOCArMzQsMTEgQEAKICNpbmNsdWRlICJpbmNsdWRlL1NoYXJlZE1lbW9yeUJ1ZmZlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXVzaW5nIE1lZGlhRGVzY3JhbWJsZXI6OkRlc2NyYW1ibGVJbmZvOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwogdXNpbmcgQnVmZmVySW5mbyA9IEFDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlckluZm87CiB1c2luZyBCdWZmZXJJbmZvSXRlcmF0b3IgPSBzdGQ6OnZlY3Rvcjxjb25zdCBCdWZmZXJJbmZvPjo6Y29uc3RfaXRlcmF0b3I7CiAKQEAgLTExNCw3NCArMTE3LDk3IEBACiAgICAgICAgIHJldHVybiAtRU5PRU5UOwogICAgIH0KIAotICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2VjdXJlSGFuZGxlID0gTlVMTDsKICAgICBpZiAoc2VjdXJlKSB7CiAgICAgICAgIHNwPFNlY3VyZUJ1ZmZlcj4gc2VjdXJlRGF0YSA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2VjdXJlQnVmZmVyICo+KGl0LT5tQ29kZWNCdWZmZXIuZ2V0KCkpOwotICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IHNlY3VyZURhdGEtPmdldERlc3RpbmF0aW9uVHlwZSgpOwotICAgICAgICBpZiAoZGVzdGluYXRpb24ubVR5cGUgIT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZSkgeworICAgICAgICBpZiAoc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25UeXBlKCkgIT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZSkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBkZXN0aW5hdGlvbi5tSGFuZGxlID0KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25Qb2ludGVyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeTsKLSAgICAgICAgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeSA9IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgICAgIHNlY3VyZUhhbmRsZSA9IHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7CiAgICAgfQotCi0gICAgSUNyeXB0bzo6U291cmNlQnVmZmVyIHNvdXJjZTsKLSAgICBzb3VyY2UubVNoYXJlZE1lbW9yeSA9IGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyOwotICAgIHNvdXJjZS5tSGVhcFNlcU51bSA9IG1IZWFwU2VxTnVtOwotCiAgICAgc3NpemVfdCByZXN1bHQgPSAtMTsKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tSGFuZGxlID0gc2VjdXJlSGFuZGxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5OworICAgICAgICAgICAgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeSA9IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgICAgIH0KKworICAgICAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOworICAgICAgICBzb3VyY2UubVNoYXJlZE1lbW9yeSA9IGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyOworICAgICAgICBzb3VyY2UubUhlYXBTZXFOdW0gPSBtSGVhcFNlcU51bTsKKwogICAgICAgICByZXN1bHQgPSBtQ3J5cHRvLT5kZWNyeXB0KGtleSwgaXYsIG1vZGUsIHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgc291cmNlLCBpdC0+bUNsaWVudEJ1ZmZlci0+b2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZGVzdGluYXRpb24sIGVycm9yRGV0YWlsTXNnKTsKLSAgICB9IGVsc2UgewotICAgICAgICBEZXNjcmFtYmxlSW5mbyBkZXNjcmFtYmxlSW5mbzsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uZHN0VHlwZSA9IGRlc3RpbmF0aW9uLm1UeXBlID09Ci0gICAgICAgICAgICAgICAgSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSA/Ci0gICAgICAgICAgICAgICAgRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIgOgotICAgICAgICAgICAgICAgIERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zY3JhbWJsaW5nQ29udHJvbCA9IGtleSAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAoRGVzY3JhbWJsZXJQbHVnaW46OlNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6Ci0gICAgICAgICAgICAgICAgRGVzY3JhbWJsZXJQbHVnaW46OmtTY3JhbWJsaW5nX1Vuc2NyYW1ibGVkOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5udW1TdWJTYW1wbGVzID0gbnVtU3ViU2FtcGxlczsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc3ViU2FtcGxlcyA9IChEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlICopc3ViU2FtcGxlczsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc3JjTWVtID0gaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXI7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLnNyY09mZnNldCA9IDA7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLmRzdFB0ciA9IE5VTEw7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLmRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgaW50MzJfdCBkZXNjcmFtYmxlUmVzdWx0ID0gLTE7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoZGVzY3JhbWJsZUluZm8sICZkZXNjcmFtYmxlUmVzdWx0KTsKLQotICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gZGVzY3JhbWJsZVJlc3VsdDsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGVzY3JhbWJsZSBmYWlsZWQsIGV4Y2VwdGlvbkNvZGU9JWQsIGVycj0lZCwgcmVzdWx0PSV6ZCIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCksIHJlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsIHJlc3VsdD0lemQiLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChyZXN1bHQgPiAwICYmIGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKLSAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5LT5wb2ludGVyKCksCisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7CisgICAgICAgICAgICBtZW1jcHkoaXQtPm1Db2RlY0J1ZmZlci0+YmFzZSgpLCBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5LT5wb2ludGVyKCksIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBIZXJlIHdlIGNhc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgdG8gaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTdWJTYW1wbGUKKyAgICAgICAgLy8gZGlyZWN0bHksIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIGFzIGNoZWNrZWQgaW4gRGVzY3JhbWJsZXJJbXBsLmNwcC4KKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBoaWRsU3ViU2FtcGxlczsKKyAgICAgICAgaGlkbFN1YlNhbXBsZXMuc2V0VG9FeHRlcm5hbCgoU3ViU2FtcGxlICopc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZmFsc2UgLypvd24qLyk7CisKKyAgICAgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlci0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKKyAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgc3JjQnVmZmVyID0geworICAgICAgICAgICAgICAgIC5oZWFwQmFzZSA9IG1IaWRsTWVtb3J5LAorICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAodWludDY0X3QpIG9mZnNldCwKKyAgICAgICAgICAgICAgICAuc2l6ZSA9IHNpemUKKyAgICAgICAgfTsKKworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5zZWN1cmVNZW1vcnkgPSBoaWRsX2hhbmRsZShzZWN1cmVIYW5kbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZOworICAgICAgICAgICAgZHN0QnVmZmVyLm5vbnNlY3VyZU1lbW9yeSA9IHNyY0J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOworCisgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKKyAgICAgICAgICAgICAgICBrZXkgIT0gTlVMTCA/IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF0gOiBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQsCisgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZyZXN1bHQsICZkZXRhaWxlZEVycm9yXSAoCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfc3RhdHVzOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoc3NpemVfdClfYnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpPSyB8fCByZXN1bHQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQsIHJlc3VsdD0lemQiLAorICAgICAgICAgICAgICAgICAgICByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIHJlc3VsdCk7CisKKyAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgICAgIG1lbWNweShpdC0+bUNvZGVjQnVmZmVyLT5iYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlci0+cG9pbnRlcigpLCByZXN1bHQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBpZiAoZGVzdGluYXRpb24ubVR5cGUgPT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSkgewotICAgICAgICBtZW1jcHkoaXQtPm1Db2RlY0J1ZmZlci0+YmFzZSgpLCBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5LT5wb2ludGVyKCksIHJlc3VsdCk7Ci0gICAgfQotCiAgICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgcmVzdWx0KTsKIAogICAgIC8vIENvcHkgbWV0YWRhdGEgZnJvbSBjbGllbnQgdG8gY29kZWMgYnVmZmVyLgpAQCAtMjc1LDEwICszMDEsMjEgQEAKICAgICAgICAgaW50MzJfdCBzZXFOdW0gPSBtQ3J5cHRvLT5zZXRIZWFwKGRlYWxlci0+Z2V0TWVtb3J5SGVhcCgpKTsKICAgICAgICAgaWYgKHNlcU51bSA+PSAwKSB7CiAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IHNlcU51bTsKLSAgICAgICAgICAgIEFMT0dEKCJzZXRIZWFwIHJldHVybmVkIG1IZWFwU2VxTnVtPSVkIiwgbUhlYXBTZXFOdW0pOworICAgICAgICAgICAgQUxPR1YoInNldEhlYXAgcmV0dXJuZWQgbUhlYXBTZXFOdW09JWQiLCBtSGVhcFNlcU51bSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IC0xOwotICAgICAgICAgICAgQUxPR0QoInNldEhlYXAgZmFpbGVkLCBzZXR0aW5nIG1IZWFwU2VxTnVtPS0xIik7CisgICAgICAgICAgICBBTE9HRSgic2V0SGVhcCBmYWlsZWQsIHNldHRpbmcgbUhlYXBTZXFOdW09LTEiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobURlc2NyYW1ibGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBkZWFsZXItPmdldE1lbW9yeUhlYXAoKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKG5hdGl2ZUhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbnQgZmQgPSBoZWFwLT5nZXRIZWFwSUQoKTsKKyAgICAgICAgICAgIG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgICAgICAgICAgbUhpZGxNZW1vcnkgPSBoaWRsX21lbW9yeSgiYXNobWVtIiwgaGlkbF9oYW5kbGUobmF0aXZlSGFuZGxlKSwgaGVhcC0+Z2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVkIGhpZGxfbWVtb3J5IGZvciBkZXNjcmFtYmxlciIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjcmVhdGUgaGlkbF9tZW1vcnkgZm9yIGRlc2NyYW1ibGVyIik7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGRlYWxlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IDZjYzFhY2UuLjIwNDFiODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsNyBAQAogICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKICAgICAgICAgIkF1ZGlvU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJJbXBsLmNwcCIsCisgICAgICAgICJDb2RlY0Jhc2UuY3BwIiwKICAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIiwKQEAgLTEwNCw2ICsxMDUsOSBAQAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJAMS4wIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MTBiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlY0Jhc2UiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIEJ1ZmZlckNoYW5uZWxCYXNlOjpzZXRDcnlwdG8oY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bykgeworICAgIG1DcnlwdG8gPSBjcnlwdG87Cit9CisKK3ZvaWQgQnVmZmVyQ2hhbm5lbEJhc2U6OnNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKSB7CisgICAgbURlc2NyYW1ibGVyID0gZGVzY3JhbWJsZXI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwCmluZGV4IDkxNzg3MGYuLjFhYTNiYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcApAQCAtODgsNyArODgsOSBAQAogCiBzdGF0dXNfdCBGcmFtZVJlbmRlclRyYWNrZXI6Om9uRnJhbWVSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHN5c3RlbU5hbm8pIHsKICAgICAvLyBlbnN1cmUgbW9ub3RvbmljIHRpbWVzdGFtcHMKLSAgICBpZiAobUxhc3RSZW5kZXJUaW1lTnMgPj0gc3lzdGVtTmFubykgeworICAgIGlmIChtTGFzdFJlbmRlclRpbWVOcyA+IHN5c3RlbU5hbm8gfHwKKyAgICAgICAgLy8gRU9TIGlzIG5vcm1hbGx5IG1hcmtlZCBvbiB0aGUgbGFzdCBmcmFtZQorICAgICAgICAobUxhc3RSZW5kZXJUaW1lTnMgPT0gc3lzdGVtTmFubyAmJiBtZWRpYVRpbWVVcyAhPSBJTlQ2NF9NQVgpKSB7CiAgICAgICAgIEFMT0dXKCJbJXNdIElnbm9yaW5nIG91dCBvZiBvcmRlci9zdGFsZSBzeXN0ZW0gbmFubyAlbGxkIGZvciBtZWRpYSB0aW1lICVsbGQgZnJvbSBjb2RlYy4iLAogICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpc3lzdGVtTmFubywgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IGJkNzE2MzIuLjk4ZDEwMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0yMyw3ICsyMyw4IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9TaGFyZWRNZW1vcnlCdWZmZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA1MWYxYmEzLi42NDBjYjgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTnVNZWRpYUV4dHJhY3RvciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTgzLDggKzgyLDggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGlmIChtQ2FzICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXMpOworICAgIGlmICghbUNhc1Rva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXNUb2tlbik7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CkBAIC0xMTksOCArMTE4LDggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGlmIChtQ2FzICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXMpOworICAgIGlmICghbUNhc1Rva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXNUb2tlbik7CiAgICAgfQogCiAgICAgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CkBAIC0xNDksOCArMTQ4LDggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGlmIChtQ2FzICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXMpOworICAgIGlmICghbUNhc1Rva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXNUb2tlbik7CiAgICAgfQogCiAgICAgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CkBAIC0xNjEsMjQgKzE2MCwzNiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpIHsKLSAgICBBTE9HVigic2V0TWVkaWFDYXM6IGNhcz0lcCIsIGNhcy5nZXQoKSk7CitzdGF0aWMgU3RyaW5nOCBhcnJheVRvU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhcnJheSkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCAiLCBhcnJheVtpXSk7CisgICAgfQorICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIihudWxsKSIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSB7CisgICAgQUxPR1YoInNldE1lZGlhQ2FzOiBjYXNUb2tlbj17JXN9IiwgYXJyYXlUb1N0cmluZyhjYXNUb2tlbikuY19zdHIoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgaWYgKGNhcyA9PSBOVUxMKSB7CisgICAgaWYgKGNhc1Rva2VuLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBtQ2FzVG9rZW4gPSBjYXNUb2tlbjsKKwogICAgIGlmIChtSW1wbCAhPSBOVUxMKSB7Ci0gICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhjYXMpOworICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMoY2FzVG9rZW4pOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSB1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1DYXMgPSBjYXM7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IDlmYmRiNzIuLmUwYzBjMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC0yMTgsNiArMjE4LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRBQUMyOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKChPTVhfVTMyKSBpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ0FBQyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9CkBAIC0zNDIsNiArMzY2LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nQUFDKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKaW5kZXggNzU1MzE1My4uYjdlODRlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCkBAIC0xNDMsNiArMTQzLDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRBTVI6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdBTVIgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FtcjoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKmFtclBhcmFtcyA9CkBAIC0yMzYsNiArMjYwLDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nQU1SKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FtcjoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKmFhY1BhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAppbmRleCBmN2MwNDI5Li43YTRjY2E5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKQEAgLTEwNSw2ICsxMDUsMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdEc3MTE6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdHNzExIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTE3Myw2ICsxOTcsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdHNzExKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCmluZGV4IDExOTk5YjQuLmQ3NzcyMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCkBAIC0xMDUsNiArMTA1LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRHU006OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdHU01GUiA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0xNjQsNiArMTg4LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nR1NNRlIpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDNkZWYxZjAuLjIzNjQ2ODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTM0LDYgKzEzNCwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0TVAzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nTVAzIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTIwOCw2ICsyMzIsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdNUDMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAppbmRleCAyYWM2Y2UwLi5kMWY1ZTU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTEyOSw2ICsxMjksMzEgQEAKIE9NWF9FUlJPUlRZUEUgU29mdE9wdXM6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoKGludClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gKE9NWF9BVURJT19DT0RJTkdUWVBFKU9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUyA6CisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXM6CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICpvcHVzUGFyYW1zID0KQEAgLTIxMiw2ICsyMzcsMzAgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0FVRElPX0NPRElOR1RZUEUpT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAppbmRleCBhY2IyYjM3Li4xYTUyN2IzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKQEAgLTYwLDcgKzYwLDcgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gMzIgKiAxMDI0OworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDY0ICogMTAyNDsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CkBAIC03OCw3ICs3OCw3IEBACiAgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSAzMiAqIDEwMjQ7CisgICAgZGVmLm5CdWZmZXJTaXplID0gNjQgKiAxMDI0OwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKQEAgLTEwMCw2ICsxMDAsMjggQEAKIE9NWF9FUlJPUlRZUEUgU29mdFJhdzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTE1Myw2ICsxNzUsMjYgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggMTRkZDI1MC4uOTZlMDFiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTEyOSw2ICsxMjksMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdFZvcmJpczo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ1ZPUkJJUyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KQEAgLTIyMSw2ICsyNDUsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdWT1JCSVMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAppbmRleCA5MTQ2MmM4Li45MTA4Y2UxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCkBAIC0xLDcgKzEsMTIgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSIsCkBAIC0xMSwxMiArMTYsMTMgQEAKICAgICAgICAgImluY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbiIsCiAgICAgXSwKIAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgIF0sCi0KICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oCmluZGV4IDBkYTJlODEuLmYyNTNhNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oCkBAIC0zMCw2ICszMCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgaGFyZHdhcmU6OmhpZGxfbWVtb3J5OworCiAvKioKICAqIEJ1ZmZlckNoYW5uZWxCYXNlIGltcGxlbWVudGF0aW9uIGZvciBBQ29kZWMuCiAgKi8KQEAgLTExNyw2ICsxMTksNyBAQAogICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKICAgICBzcDxJTWVtb3J5PiBtRGVjcnlwdERlc3RpbmF0aW9uOwogICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisgICAgaGlkbF9tZW1vcnkgbUhpZGxNZW1vcnk7CiAKICAgICAvLyBUaGVzZSBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCB2aWEgc3RkOjphdG9taWNfKiBmdW5jdGlvbnMuCiAgICAgLy8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKaW5kZXggMmE3NTI5OGYuLmFjOTNiNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCkBAIC00NSw3ICs0NSw3IEBACiAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJUU0V4dHJhY3RvciI7IH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCmluZGV4IDBkZDc3YmEuLjYyNDVjY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaApAQCAtMjQsMjcgKzI0LDMxIEBACiAKICNkZWZpbmUgU1RSSU5HSUZZX0VOVU1TCiAKLSNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KICNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KIAotI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKIGNsYXNzIEJ1ZmZlckNoYW5uZWxCYXNlOwogc3RydWN0IEJ1ZmZlclByb2R1Y2VyV3JhcHBlcjsKIGNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7CiBzdHJ1Y3QgUGVyc2lzdGVudFN1cmZhY2U7CiBzdHJ1Y3QgUmVuZGVyZWRGcmFtZUluZm87CiBjbGFzcyBTdXJmYWNlOworc3RydWN0IElDcnlwdG87CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhcyB7CituYW1lc3BhY2UgbmF0aXZlIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJRGVzY3JhbWJsZXI7Cit9fX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OklEZXNjcmFtYmxlcjsKIAogc3RydWN0IENvZGVjQmFzZSA6IHB1YmxpYyBBSGFuZGxlciwgLyogc3RhdGljICovIENvbG9yVXRpbHMgewogICAgIC8qKgpAQCAtMjU2LDEzICsyNjAsOSBAQAogICAgICAgICBtQ2FsbGJhY2sgPSBzdGQ6Om1vdmUoY2FsbGJhY2spOwogICAgIH0KIAotICAgIGlubGluZSB2b2lkIHNldENyeXB0byhjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvKSB7Ci0gICAgICAgIG1DcnlwdG8gPSBjcnlwdG87Ci0gICAgfQorICAgIHZvaWQgc2V0Q3J5cHRvKGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8pOwogCi0gICAgaW5saW5lIHZvaWQgc2V0RGVzY3JhbWJsZXIoY29uc3Qgc3A8SURlc2NyYW1ibGVyPiAmZGVzY3JhbWJsZXIpIHsKLSAgICAgICAgbURlc2NyYW1ibGVyID0gZGVzY3JhbWJsZXI7Ci0gICAgfQorICAgIHZvaWQgc2V0RGVzY3JhbWJsZXIoY29uc3Qgc3A8SURlc2NyYW1ibGVyPiAmZGVzY3JhbWJsZXIpOwogCiAgICAgLyoqCiAgICAgICogUXVldWUgYW4gaW5wdXQgYnVmZmVyIGludG8gdGhlIGJ1ZmZlciBjaGFubmVsLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAppbmRleCA0MTQwMjY2Li4yMDlmZTEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaApAQCAtNDcsMTAgKzQ3LDEzIEBACiBzdHJ1Y3QgUGVyc2lzdGVudFN1cmZhY2U7CiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyOwogY2xhc3MgU3VyZmFjZTsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJRGVzY3JhbWJsZXI7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIG5hdGl2ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSURlc2NyYW1ibGVyOworfX19fQordXNpbmcgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpJRGVzY3JhbWJsZXI7CiAKIHN0cnVjdCBNZWRpYUNvZGVjIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIENvbmZpZ3VyZUZsYWdzIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAppbmRleCAyZTY2M2VjLi42YTVjNmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCkBAIC03OSw2ICs3OSwyNiBAQAogICAgIEhFQVJUQkVBVF9FUlJPUl9CQVNFID0gLTMwMDAsCiAgICAgRVJST1JfSEVBUlRCRUFUX1RFUk1JTkFURV9SRVFVRVNURUQgICAgICAgICAgICAgICAgICAgICA9IEhFQVJUQkVBVF9FUlJPUl9CQVNFLAogCisgICAgLy8gQ0FTLXJlbGF0ZWQgZXJyb3IgY29kZXMKKyAgICBDQVNfRVJST1JfQkFTRSA9IC00MDAwLAorCisgICAgRVJST1JfQ0FTX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFLAorICAgIEVSUk9SX0NBU19OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDEsCisgICAgRVJST1JfQ0FTX0xJQ0VOU0VfRVhQSVJFRCAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMiwKKyAgICBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAzLAorICAgIEVSUk9SX0NBU19ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICAgPSBDQVNfRVJST1JfQkFTRSAtIDQsCisgICAgRVJST1JfQ0FTX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gNSwKKyAgICBFUlJPUl9DQVNfQ0FOTk9UX0hBTkRMRSAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA2LAorICAgIEVSUk9SX0NBU19UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDcsCisgICAgRVJST1JfQ0FTX05PVF9QUk9WSVNJT05FRCAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gOCwKKyAgICBFUlJPUl9DQVNfREVWSUNFX1JFVk9LRUQgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA5LAorICAgIEVSUk9SX0NBU19SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDEwLAorICAgIEVSUk9SX0NBU19JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT04gPSBDQVNfRVJST1JfQkFTRSAtIDExLAorICAgIEVSUk9SX0NBU19MQVNUX1VTRURfRVJST1JDT0RFICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDExLAorCisgICAgRVJST1JfQ0FTX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gNTAwLAorICAgIEVSUk9SX0NBU19WRU5ET1JfTUlOICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDk5OSwKKwogICAgIC8vIE5ESyBFcnJvciBjb2RlcwogICAgIC8vIGZyYW1ld29ya3MvYXYvaW5jbHVkZS9uZGsvTmRrTWVkaWFFcnJvci5oCiAgICAgLy8gZnJvbSAtMTAwMDAgKDB4RkZGRkQ4RjAgLSAweEZGRkZEOEVDKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCmluZGV4IGE4NTZiMmIuLmYxMjE2MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKQEAgLTIzLDEwICsyMyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotfTsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKIGNsYXNzIERhdGFTb3VyY2U7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CiBjbGFzcyBNZXRhRGF0YTsKQEAgLTcwLDcgKzY2LDcgQEAKICAgICB9CiAgICAgdmlydHVhbCB2b2lkIHNldFVJRCh1aWRfdCAvKnVpZCovKSB7CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4mIC8qY2FzKi8pIG92ZXJyaWRlIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmLypjYXNUb2tlbiovKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggM2UzY2MxNy4uNmE5M2JkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTI4LDEwICsyOCw2IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotfQotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBTWVzc2FnZTsKQEAgLTY0LDcgKzYwLDcgQEAKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFzb3VyY2UpOwogCi0gICAgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcyk7CisgICAgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbik7CiAKICAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRUcmFja0Zvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0LCB1aW50MzJfdCBmbGFncyA9IDApIGNvbnN0OwpAQCAtMTE1LDcgKzExMSw3IEBACiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAKICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IG1JbXBsOwotICAgIHNwPElDYXM+IG1DYXM7CisgICAgSEludGVyZmFjZVRva2VuIG1DYXNUb2tlbjsKIAogICAgIFZlY3RvcjxUcmFja0luZm8+IG1TZWxlY3RlZFRyYWNrczsKICAgICBpbnQ2NF90IG1Ub3RhbEJpdHJhdGU7ICAvLyBpbiBiaXRzL3NlYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IDMxZWRiMjEuLmEyNTZhNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTIzLDggKzIzLDggQEAKICNpbmNsdWRlICJFU1F1ZXVlLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNDEsOCArNDEsMTIgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXVzaW5nIE1lZGlhRGVzY3JhbWJsZXI6OkRlc2NyYW1ibGVJbmZvOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwogCiAvLyBJIHdhbnQgdGhlIGV4cHJlc3Npb24gInkiIGV2YWx1YXRlZCBldmVuIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBvZmYuCiAjZGVmaW5lIE1ZX0xPR1YoeCwgeSkgXApAQCAtMjAzLDYgKzIwNyw3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1TYW1wbGVBZXNLZXlJdGVtOwogICAgIHNwPElNZW1vcnk+IG1NZW07CiAgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKICAgICBzcDxBQnVmZmVyPiBtRGVzY3JhbWJsZWRCdWZmZXI7CiAgICAgTGlzdDxTdWJTYW1wbGVJbmZvPiBtU3ViU2FtcGxlczsKICAgICBzcDxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKQEAgLTIzNSw3ICsyNDAsNyBAQAogCiAgICAgLy8gRW5zdXJlIGludGVybmFsIGJ1ZmZlcnMgY2FuIGhvbGQgc3BlY2lmaWVkIHNpemUsIGFuZCB3aWxsIHJlLWFsbG9jYXRlCiAgICAgLy8gYXMgbmVlZGVkLgotICAgIHZvaWQgZW5zdXJlQnVmZmVyQ2FwYWNpdHkoc2l6ZV90IHNpemUpOworICAgIGJvb2wgZW5zdXJlQnVmZmVyQ2FwYWNpdHkoc2l6ZV90IHNpemUpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RyZWFtKTsKIH07CkBAIC04MDcsOSArODEyLDkgQEAKICAgICBtUXVldWUgPSBOVUxMOwogfQogCi12b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjplbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3QgbmVlZGVkU2l6ZSkgeworYm9vbCBBVFNQYXJzZXI6OlN0cmVhbTo6ZW5zdXJlQnVmZmVyQ2FwYWNpdHkoc2l6ZV90IG5lZWRlZFNpemUpIHsKICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMICYmIG1CdWZmZXItPmNhcGFjaXR5KCkgPj0gbmVlZGVkU2l6ZSkgewotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIEFMT0dWKCJlbnN1cmVCdWZmZXJDYXBhY2l0eTogY3VycmVudCBzaXplICV6dSwgbmV3IHNpemUgJXp1LCBzY3JhbWJsZWQgJWQiLApAQCAtODM3LDYgKzg0MiwyNiBAQAogICAgICAgICBtTWVtID0gbmV3TWVtOwogICAgICAgICBtRGVhbGVyID0gbmV3RGVhbGVyOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXIgPSBuZXdTY3JhbWJsZWRCdWZmZXI7CisKKyAgICAgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG5ld01lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKKyAgICAgICAgaWYgKGhlYXAgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmF0aXZlSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgICAgIGlmICghbmF0aXZlSGFuZGxlKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZmFpbGVkIHRvIGNyZWF0ZSBuYXRpdmUgaGFuZGxlIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA9IGhlYXAtPmdldEhlYXBJRCgpOworICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuaGVhcEJhc2UgPSBoaWRsX21lbW9yeSgiYXNobWVtIiwKKyAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZShuYXRpdmVIYW5kbGUpLCBoZWFwLT5nZXRTaXplKCkpOworICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIub2Zmc2V0ID0gKHVpbnQ2NF90KSBvZmZzZXQ7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gKHVpbnQ2NF90KSBzaXplOworCisgICAgICAgIEFMT0dEKCJbc3RyZWFtICVkXSBjcmVhdGVkIHNoYXJlZCBidWZmZXIgZm9yIGRlc2NyYW1ibGluZywgb2Zmc2V0ICV6ZCwgc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBvZmZzZXQsIHNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKQEAgLTg1MCw2ICs4NzUsNyBAQAogICAgICAgICBuZXdCdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIH0KICAgICBtQnVmZmVyID0gbmV3QnVmZmVyOworICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2UoCkBAIC05MjMsNyArOTQ5LDkgQEAKICAgICB9CiAKICAgICBzaXplX3QgbmVlZGVkU2l6ZSA9IG1CdWZmZXItPnNpemUoKSArIHBheWxvYWRTaXplQml0cyAvIDg7Ci0gICAgZW5zdXJlQnVmZmVyQ2FwYWNpdHkobmVlZGVkU2l6ZSk7CisgICAgaWYgKCFlbnN1cmVCdWZmZXJDYXBhY2l0eShuZWVkZWRTaXplKSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KIAogICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5zaXplKCksIGJyLT5kYXRhKCksIHBheWxvYWRTaXplQml0cyAvIDgpOwogICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSArIHBheWxvYWRTaXplQml0cyAvIDgpOwpAQCAtMTM2NSw0NyArMTM5Myw1OSBAQAogICAgICAgICBtZW1jcHkobURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKICAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCBkZXNjcmFtYmxlQnl0ZXMpOwogCi0gICAgICAgIHNwPEFCdWZmZXI+IHN1YlNhbXBsZXMgPSBuZXcgQUJ1ZmZlcigKLSAgICAgICAgICAgICAgICBzaXplb2YoRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSkgKiBkZXNjcmFtYmxlU3ViU2FtcGxlcyk7Ci0KLSAgICAgICAgRGVzY3JhbWJsZUluZm8gaW5mbzsKLSAgICAgICAgaW5mby5kc3RUeXBlID0gRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXI7Ci0gICAgICAgIGluZm8uc2NyYW1ibGluZ0NvbnRyb2wgPSAoRGVzY3JhbWJsZXJQbHVnaW46OlNjcmFtYmxpbmdDb250cm9sKXNjdHJsOwotICAgICAgICBpbmZvLm51bVN1YlNhbXBsZXMgPSBkZXNjcmFtYmxlU3ViU2FtcGxlczsKLSAgICAgICAgaW5mby5zdWJTYW1wbGVzID0gKERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGUgKilzdWJTYW1wbGVzLT5kYXRhKCk7Ci0gICAgICAgIGluZm8uc3JjTWVtID0gbU1lbTsKLSAgICAgICAgaW5mby5zcmNPZmZzZXQgPSAwOwotICAgICAgICBpbmZvLmRzdFB0ciA9IE5VTEw7IC8vIGluLXBsYWNlIGRlc2NyYW1ibGluZyBpbnRvIHNyY01lbQotICAgICAgICBpbmZvLmRzdE9mZnNldCA9IDA7CisgICAgICAgIGhpZGxfdmVjPFN1YlNhbXBsZT4gc3ViU2FtcGxlczsKKyAgICAgICAgc3ViU2FtcGxlcy5yZXNpemUoZGVzY3JhbWJsZVN1YlNhbXBsZXMpOwogCiAgICAgICAgIGludDMyX3QgaSA9IDA7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1TdWJTYW1wbGVzLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgaXQgIT0gbVN1YlNhbXBsZXMuZW5kKCkgJiYgaSA8IGRlc2NyYW1ibGVTdWJTYW1wbGVzOyBpdCsrLCBpKyspIHsKICAgICAgICAgICAgIGlmIChpdC0+dHJhbnNwb3J0X3NjcmFtYmxpbmdfbW9kZSAhPSAwIHx8IHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgPSAwOwotICAgICAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSAwOworICAgICAgICAgICAgICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhID0gaXQtPnN1YlNhbXBsZVNpemU7Ci0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IDA7CisgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mQ2xlYXJEYXRhID0gaXQtPnN1YlNhbXBsZVNpemU7CisgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICB1aW50NjRfdCBzcmNPZmZzZXQgPSAwLCBkc3RPZmZzZXQgPSAwOwogICAgICAgICAvLyBJZiBzY3JhbWJsZWQgYXQgUEVTLWxldmVsLCBQRVMgaGVhZGVyIHNob3VsZCBiZSBza2lwcGVkCiAgICAgICAgIGlmIChwZXNTY3JhbWJsaW5nQ29udHJvbCAhPSAwKSB7Ci0gICAgICAgICAgICBpbmZvLnNyY09mZnNldCA9IGluZm8uZHN0T2Zmc2V0ID0gcGVzT2Zmc2V0OwotICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzWzBdLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSAtPSBwZXNPZmZzZXQ7CisgICAgICAgICAgICBzcmNPZmZzZXQgPSBkc3RPZmZzZXQgPSBwZXNPZmZzZXQ7CisgICAgICAgICAgICBzdWJTYW1wbGVzWzBdLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhIC09IHBlc09mZnNldDsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKGluZm8sICZyZXN1bHQpOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICAgICAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKKyAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKIAotICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgZXhjZXB0aW9uQ29kZT0lZCIsCi0gICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpKTsKKyAgICAgICAgRGVzdGluYXRpb25CdWZmZXIgZHN0QnVmZmVyOworICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlk7CisgICAgICAgIGRzdEJ1ZmZlci5ub25zZWN1cmVNZW1vcnkgPSBtRGVzY3JhbWJsZXJTcmNCdWZmZXI7CisKKyAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAorICAgICAgICAgICAgICAgIChTY3JhbWJsaW5nQ29udHJvbCkgc2N0cmwsCisgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0LAorICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZieXRlc1dyaXR0ZW4sICZkZXRhaWxlZEVycm9yXSAoCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfc3RhdHVzOworICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBfYnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcyIsCisgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJWQgYnl0ZXMiLAotICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXN1bHQpOworICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBieXRlc1dyaXR0ZW4pOwogICAgICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpLCBtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDM3NGUwMTEuLjQxYzE5Y2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtMjksMTEgKzI5LDEzIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLWNsYXNzIElEZXNjcmFtYmxlcjsKLX07Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhcyB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSUNhczsKK319fQordXNpbmcgaGFyZHdhcmU6OmNhczo6VjFfMDo6SUNhczsKKwogY2xhc3MgQUJpdFJlYWRlcjsKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKaW5kZXggOTZlYjViZi4uMjEyNTljNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icApAQCAtMzUsNSArMzUsOCBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5jcHAKaW5kZXggMDQ3YjFiMy4uOWZmNDUyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwCkBAIC0xOCwxNSArMTgsMTkgQEAKICNkZWZpbmUgTE9HX1RBRyAiQ2FzTWFuYWdlciIKICNpbmNsdWRlICJDYXNNYW5hZ2VyLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lDYXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy8xLjAvSUNhcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzLzEuMC9JTWVkaWFDYXNTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOworCit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwogCiBzdHJ1Y3QgQVRTUGFyc2VyOjpDYXNNYW5hZ2VyOjpQcm9ncmFtQ2FzTWFuYWdlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBQcm9ncmFtQ2FzTWFuYWdlcih1bnNpZ25lZCBwcm9ncmFtTnVtYmVyLCBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IpOwpAQCAtMTI1LDQ1ICsxMjksNjAgQEAKICAgICAgICAgIGNvbnN0IHNwPElDYXM+JiBjYXMsCiAgICAgICAgICBQaWRUb1Nlc3Npb25NYXAgJnNlc3Npb25NYXAsCiAgICAgICAgICBDYXNTZXNzaW9uICpzZXNzaW9uKSB7Ci0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIHNwPElCaW5kZXI+IGNhc1NlcnZpY2VCaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY2FzIikpOwotICAgIHNwPElNZWRpYUNhc1NlcnZpY2U+IGNhc1NlcnZpY2UgPQotICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhQ2FzU2VydmljZT4oY2FzU2VydmljZUJpbmRlcik7Ci0KKyAgICBzcDxJTWVkaWFDYXNTZXJ2aWNlPiBjYXNTZXJ2aWNlID0gSU1lZGlhQ2FzU2VydmljZTo6Z2V0U2VydmljZSgiZGVmYXVsdCIpOwogICAgIGlmIChjYXNTZXJ2aWNlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gSU1lZGlhQ2FzU2VydmljZSIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKKyAgICBTdGF0dXMgc3RhdHVzOwogICAgIHNwPElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXI7CisgICAgc3A8SURlc2NyYW1ibGVyQmFzZT4gZGVzY3JhbWJsZXJCYXNlOworICAgIFJldHVybjxTdGF0dXM+IHJldHVyblN0YXR1cyhTdGF0dXM6Ok9LKTsKKyAgICBSZXR1cm48c3A8SURlc2NyYW1ibGVyQmFzZT4gPiByZXR1cm5EZXNjcmFtYmxlcihOVUxMKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CiAgICAgY29uc3QgQ0FEZXNjcmlwdG9yICZkZXNjcmlwdG9yID0gc2Vzc2lvbi0+bUNBRGVzY3JpcHRvcjsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBjYXMtPm9wZW5TZXNzaW9uKCZzZXNzaW9uSWQpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gc2Vzc2lvbjogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICBhdXRvIHJldHVyblZvaWQgPSBjYXMtPm9wZW5TZXNzaW9uKAorICAgICAgICAgICAgWyZzdGF0dXMsICZzZXNzaW9uSWRdIChTdGF0dXMgX3N0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIF9zZXNzaW9uSWQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBfc3RhdHVzOworICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IF9zZXNzaW9uSWQ7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBzZXNzaW9uOiB0cmFucz0lcywgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgY2FzLT5zZXRTZXNzaW9uUHJpdmF0ZURhdGEoc2Vzc2lvbklkLCBkZXNjcmlwdG9yLm1Qcml2YXRlRGF0YSk7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHByaXZhdGUgZGF0YTogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5TdGF0dXMgPSBjYXMtPnNldFNlc3Npb25Qcml2YXRlRGF0YShzZXNzaW9uSWQsIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhKTsKKyAgICBpZiAoIXJldHVyblN0YXR1cy5pc09rKCkgfHwgcmV0dXJuU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcHJpdmF0ZSBkYXRhOiB0cmFucz0lcywgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICByZXR1cm5TdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpLCAoU3RhdHVzKXJldHVyblN0YXR1cyk7CiAgICAgICAgIGdvdG8gbF9mYWlsOwogICAgIH0KIAotICAgIHN0YXR1cyA9IGNhc1NlcnZpY2UtPmNyZWF0ZURlc2NyYW1ibGVyKGRlc2NyaXB0b3IubVN5c3RlbUlELCAmZGVzY3JhbWJsZXIpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSB8fCBkZXNjcmFtYmxlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRlc2NyYW1ibGVyOiA6IGV4Y2VwdGlvbj0lZCwgZXJyb3I9JWQiLAotICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSk7CisgICAgcmV0dXJuRGVzY3JhbWJsZXIgPSBjYXNTZXJ2aWNlLT5jcmVhdGVEZXNjcmFtYmxlcihkZXNjcmlwdG9yLm1TeXN0ZW1JRCk7CisgICAgaWYgKCFyZXR1cm5EZXNjcmFtYmxlci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGVzY3JhbWJsZXI6IHRyYW5zPSVzIiwKKyAgICAgICAgICAgICAgICByZXR1cm5EZXNjcmFtYmxlci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICBnb3RvIGxfZmFpbDsKKyAgICB9CisgICAgZGVzY3JhbWJsZXJCYXNlID0gKHNwPElEZXNjcmFtYmxlckJhc2U+KSByZXR1cm5EZXNjcmFtYmxlcjsKKyAgICBpZiAoZGVzY3JhbWJsZXJCYXNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGVzY3JhbWJsZXI6IG51bGwgcHRyIik7CiAgICAgICAgIGdvdG8gbF9mYWlsOwogICAgIH0KIAotICAgIHN0YXR1cyA9IGRlc2NyYW1ibGVyLT5zZXRNZWRpYUNhc1Nlc3Npb24oc2Vzc2lvbklkKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGRlc2NyYW1ibGVyOiA6IGV4Y2VwdGlvbj0lZCwgZXJyb3I9JWQiLAotICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSk7CisgICAgcmV0dXJuU3RhdHVzID0gZGVzY3JhbWJsZXJCYXNlLT5zZXRNZWRpYUNhc1Nlc3Npb24oc2Vzc2lvbklkKTsKKyAgICBpZiAoIXJldHVyblN0YXR1cy5pc09rKCkgfHwgKFN0YXR1cykgcmV0dXJuU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGRlc2NyYW1ibGVyOiA6IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCksIChTdGF0dXMpIHJldHVyblN0YXR1cyk7CisgICAgICAgIGdvdG8gbF9mYWlsOworICAgIH0KKworICAgIGRlc2NyYW1ibGVyID0gSURlc2NyYW1ibGVyOjpjYXN0RnJvbShkZXNjcmFtYmxlckJhc2UpOworICAgIGlmIChkZXNjcmFtYmxlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY2FzdCBmcm9tIElEZXNjcmFtYmxlckJhc2UgdG8gSURlc2NyYW1ibGVyIik7CiAgICAgICAgIGdvdG8gbF9mYWlsOwogICAgIH0KIApAQCAtMTc3LDggKzE5Niw4IEBACiAgICAgaWYgKCFzZXNzaW9uSWQuZW1wdHkoKSkgewogICAgICAgICBjYXMtPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIH0KLSAgICBpZiAoZGVzY3JhbWJsZXIgIT0gTlVMTCkgewotICAgICAgICBkZXNjcmFtYmxlci0+cmVsZWFzZSgpOworICAgIGlmIChkZXNjcmFtYmxlckJhc2UgIT0gTlVMTCkgeworICAgICAgICBkZXNjcmFtYmxlckJhc2UtPnJlbGVhc2UoKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CkBAIC0zMTYsMTEgKzMzNSwxMiBAQAogICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBNZWRpYUNhczo6UGFyY2VsYWJsZUNhc0RhdGEgZWNtKGJyLT5kYXRhKCksIGJyLT5udW1CaXRzTGVmdCgpIC8gOCk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG1JQ2FzLT5wcm9jZXNzRWNtKG1DQVBpZFRvU2Vzc2lvbklkTWFwW2luZGV4XSwgZWNtKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwcm9jZXNzIEVDTTogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiBlY207CisgICAgZWNtLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWJyLT5kYXRhKCksIGJyLT5udW1CaXRzTGVmdCgpIC8gOCk7CisgICAgYXV0byByZXR1cm5TdGF0dXMgPSBtSUNhcy0+cHJvY2Vzc0VjbShtQ0FQaWRUb1Nlc3Npb25JZE1hcFtpbmRleF0sIGVjbSk7CisgICAgaWYgKCFyZXR1cm5TdGF0dXMuaXNPaygpIHx8IChTdGF0dXMpIHJldHVyblN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcHJvY2VzcyBFQ006IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCksIChTdGF0dXMpIHJldHVyblN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiB0cnVlOyAvLyBoYW5kbGVkCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oCmluZGV4IDgwODhkZWMuLjgxZjY1NDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oCkBAIC0yMSwxMCArMjEsMTMgQEAKICNpbmNsdWRlIDxzZXQ+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotY2xhc3MgSURlc2NyYW1ibGVyOwotfQorbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIG5hdGl2ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSURlc2NyYW1ibGVyOworfX19fQordXNpbmcgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpJRGVzY3JhbWJsZXI7CiAKIHN0cnVjdCBBVFNQYXJzZXI6OkNhc01hbmFnZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQ2FzTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggYzNmMTI3NC4uOWQ2ODRlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0zOCw4ICszOCwxMyBAQAogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAorI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lDYXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpJQ2FzOworCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUU1BhY2tldFNpemUgPSAxODg7CiBzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJlYWRTaXplID0gMjUwMDAwTEw7CiBzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJldHJ5ID0gNjsKQEAgLTE1Niw3ICsxNjEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVELCBtaW1lKSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpIHsKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKKyAgICBIYWxUb2tlbiBoYWxUb2tlbjsKKyAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKCh1aW50OF90KiljYXNUb2tlbi5kYXRhKCksIGNhc1Rva2VuLnNpemUoKSk7CisgICAgc3A8SUNhcz4gY2FzID0gSUNhczo6Y2FzdEZyb20ocmV0cmlldmVIYWxJbnRlcmZhY2UoaGFsVG9rZW4pKTsKICAgICBBTE9HRCgic2V0TWVkaWFDYXM6ICVwIiwgY2FzLmdldCgpKTsKIAogICAgIHN0YXR1c190IGVyciA9IG1QYXJzZXItPnNldE1lZGlhQ2FzKGNhcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IGRiOTllZjIuLmIwZmFlZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0yNDYsNiArMjQ2LDE1IEBACiAgICAgdmlydHVhbCB+Q2FsbGJhY2tEaXNwYXRjaGVyKCk7CiAKIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgZnJhbWVfcmVuZGVyZWQgbWVzc2FnZSBiYXRjaGluZywgd2hpY2ggd2lsbCBldmVudHVhbGx5IGVuZCB1cCBpbiBhCisgICAgICAgIC8vIHNpbmdsZSBBTWVzc2FnZSBpbiBNZWRpYUNvZGVjIHdoZW4gaXQgaXMgc2lnbmFsZWQgdG8gdGhlIGFwcC4gQU1lc3NhZ2UgY2FuIGNvbnRhaW4KKyAgICAgICAgLy8gdXAtdG8gNjQga2V5LXZhbHVlIHBhaXJzLCBhbmQgZWFjaCBmcmFtZV9yZW5kZXJlZCBtZXNzYWdlIHVzZXMgMiBrZXlzLCBzbyB0aGUgbWF4CisgICAgICAgIC8vIHZhbHVlIGZvciB0aGlzIHdvdWxkIGJlIDMyLiBOb25ldGhlbGVzcywgbGltaXQgdGhpcyB0byAxMiB0byB3aGljaCBnaXZlcyBhdCBsZWFzdCAxMAorICAgICAgICAvLyBtc2Vjb25kcyBvZiBiYXRjaGluZyBhdCAxMjBIei4KKyAgICAgICAga01heFF1ZXVlU2l6ZSA9IDEyLAorICAgIH07CisKICAgICBNdXRleCBtTG9jazsKIAogICAgIHNwPE9NWE5vZGVJbnN0YW5jZT4gY29uc3QgbU93bmVyOwpAQCAtMjkwLDcgKzI5OSw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIG1RdWV1ZS5wdXNoX2JhY2sobXNnKTsKLSAgICBpZiAocmVhbFRpbWUpIHsKKyAgICBpZiAocmVhbFRpbWUgfHwgbVF1ZXVlLnNpemUoKSA+PSBrTWF4UXVldWVTaXplKSB7CiAgICAgICAgIG1RdWV1ZUNoYW5nZWQuc2lnbmFsKCk7CiAgICAgfQogfQpAQCAtMjE2NCw4ICsyMTczLDggQEAKICAgICAgICAgICAgIG1zZy5mZW5jZUZkID0gLTE7CiAgICAgICAgICAgICBtc2cudS5yZW5kZXJfZGF0YS50aW1lc3RhbXAgPSByZW5kZXJEYXRhW2ldLm5NZWRpYVRpbWVVczsKICAgICAgICAgICAgIG1zZy51LnJlbmRlcl9kYXRhLm5hbm9UaW1lID0gcmVuZGVyRGF0YVtpXS5uU3lzdGVtVGltZU5zOwotCi0gICAgICAgICAgICBpbnN0YW5jZS0+bURpc3BhdGNoZXItPnBvc3QobXNnLCBmYWxzZSAvKiByZWFsVGltZSAqLyk7CisgICAgICAgICAgICBib29sIHJlYWxUaW1lID0gbXNnLnUucmVuZGVyX2RhdGEudGltZXN0YW1wID09IElOVDY0X01BWDsKKyAgICAgICAgICAgIGluc3RhbmNlLT5tRGlzcGF0Y2hlci0+cG9zdChtc2csIHJlYWxUaW1lKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CmRpZmYgLS1naXQgYS9yYWRpby9BbmRyb2lkLmJwIGIvcmFkaW8vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2MTRmMi4uMDAwMDAwMAotLS0gYS9yYWRpby9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJyYWRpbyIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJSYWRpby5jcHAiLAotICAgICAgICAiSVJhZGlvLmNwcCIsCi0gICAgICAgICJJUmFkaW9DbGllbnQuY3BwIiwKLSAgICAgICAgIklSYWRpb1NlcnZpY2UuY3BwIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnJhZGlvX21ldGFkYXRhIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvLmNwcCBiL3JhZGlvL0lSYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjNiNjguLjAwMDAwMDAKLS0tIGEvcmFkaW8vSVJhZGlvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIklSYWRpbyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vUmFkaW9NZXRhZGF0YVdyYXBwZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBERVRBQ0ggPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNFVF9DT05GSUdVUkFUSU9OLAotICAgIEdFVF9DT05GSUdVUkFUSU9OLAotICAgIFNFVF9NVVRFLAotICAgIEdFVF9NVVRFLAotICAgIFNDQU4sCi0gICAgU1RFUCwKLSAgICBUVU5FLAotICAgIENBTkNFTCwKLSAgICBHRVRfUFJPR1JBTV9JTkZPUk1BVElPTiwKLSAgICBIQVNfQ09OVFJPTAotfTsKLQotY2xhc3MgQnBSYWRpbzogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpbz4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvKGNvbnN0IHNwPElCaW5kZXI+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+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9PV05FUlMgYi9yYWRpby9PV05FUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzhhMzUuLjAwMDAwMDAKLS0tIGEvcmFkaW8vT1dORVJTCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1lbGF1cmVudEBnb29nbGUuY29tCi10d2FzaWxjenlrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3JhZGlvL1JhZGlvLmNwcCBiL3JhZGlvL1JhZGlvLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkZDIyMS4uMDAwMDAwMAotLS0gYS9yYWRpby9SYWRpby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW8iCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDxyYWRpby9SYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxyYWRpby9SYWRpb0NhbGxiYWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIHsKLSAgICBzcDxJUmFkaW9TZXJ2aWNlPiAgICAgICAgICBnUmFkaW9TZXJ2aWNlOwotICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgIGtSYWRpb1NlcnZpY2VQb2xsRGVsYXkgPSA1MDAwMDA7IC8vIDAuNXMKLSAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICBrUmFkaW9TZXJ2aWNlTmFtZSAgICAgID0gIm1lZGlhLnJhZGlvIjsKLSAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICBnTG9jazsKLQotICAgIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBEZWF0aE5vdGlmaWVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewotICAgICAgICAgICAgQUxPR1YoImJpbmRlckRpZWQiKTsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7Ci0gICAgICAgICAgICBnUmFkaW9TZXJ2aWNlLmNsZWFyKCk7Ci0gICAgICAgICAgICBBTE9HVygiUmFkaW8gc2VydmljZSBkaWVkISIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHNwPERlYXRoTm90aWZpZXI+ICAgICAgICAgZ0RlYXRoTm90aWZpZXI7Ci19OyAvLyBuYW1lc3BhY2UgYW5vbnltb3VzCi0KLWNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IFJhZGlvOjpnZXRSYWRpb1NlcnZpY2UoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7Ci0gICAgaWYgKGdSYWRpb1NlcnZpY2UuZ2V0KCkgPT0gMCkgewotICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoa1JhZGlvU2VydmljZU5hbWUpKTsKLSAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1coIlJhZGlvU2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7Ci0gICAgICAgICAgICB1c2xlZXAoa1JhZGlvU2VydmljZVBvbGxEZWxheSk7Ci0gICAgICAgIH0gd2hpbGUodHJ1ZSk7Ci0gICAgICAgIGlmIChnRGVhdGhOb3RpZmllciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBnRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChnRGVhdGhOb3RpZmllcik7Ci0gICAgICAgIGdSYWRpb1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJUmFkaW9TZXJ2aWNlPihiaW5kZXIpOwotICAgIH0KLSAgICBBTE9HRV9JRihnUmFkaW9TZXJ2aWNlID09IDAsICJubyBSYWRpb1NlcnZpY2UhPyIpOwotICAgIHJldHVybiBnUmFkaW9TZXJ2aWNlOwotfQotCi0vLyBTdGF0aWMgbWV0aG9kcwotc3RhdHVzX3QgUmFkaW86Omxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQotewotICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIik7Ci0gICAgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gc2VydmljZSA9IGdldFJhZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2aWNlLT5saXN0TW9kdWxlcyhwcm9wZXJ0aWVzLCBudW1Nb2R1bGVzKTsKLX0KLQotc3A8UmFkaW8+IFJhZGlvOjphdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+JiBjYWxsYmFjaykKLXsKLSAgICBBTE9HVigiYXR0YWNoKCkiKTsKLSAgICBzcDxSYWRpbz4gcmFkaW87Ci0gICAgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gc2VydmljZSA9IGdldFJhZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJhZGlvOwotICAgIH0KLSAgICByYWRpbyA9IG5ldyBSYWRpbyhoYW5kbGUsIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJ2aWNlLT5hdHRhY2goaGFuZGxlLCByYWRpbywgY29uZmlnLCB3aXRoQXVkaW8sIHJhZGlvLT5tSVJhZGlvKTsKLQotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmFkaW8tPm1JUmFkaW8gIT0gMCkgewotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihyYWRpby0+bUlSYWRpbyktPmxpbmtUb0RlYXRoKHJhZGlvKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiRXJyb3IgJWQgY29ubmVjdGluZyB0byByYWRpbyBzZXJ2aWNlIiwgc3RhdHVzKTsKLSAgICAgICAgcmFkaW8uY2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJhZGlvOwotfQotCi0KLQotLy8gUmFkaW8KLVJhZGlvOjpSYWRpbyhyYWRpb19oYW5kbGVfdCAvKmhhbmRsZSovLCBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spCi0gICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spCi17Ci19Ci0KLVJhZGlvOjp+UmFkaW8oKQotewotICAgIGlmIChtSVJhZGlvICE9IDApIHsKLSAgICAgICAgbUlSYWRpby0+ZGV0YWNoKCk7Ci0gICAgfQotfQotCi0KLXZvaWQgUmFkaW86OmRldGFjaCgpIHsKLSAgICBBTE9HVigiZGV0YWNoKCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIGlmIChtSVJhZGlvICE9IDApIHsKLSAgICAgICAgbUlSYWRpby0+ZGV0YWNoKCk7Ci0gICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1JUmFkaW8pLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICBtSVJhZGlvID0gMDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Z2V0Q29uZmlndXJhdGlvbihjb25maWcpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6c2V0TXV0ZShib29sIG11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+c2V0TXV0ZShtdXRlKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmdldE11dGUoYm9vbCAqbXV0ZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5nZXRNdXRlKG11dGUpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YmNoYW5uZWwpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+c2NhbihkaXJlY3Rpb24sIHNraXBTdWJjaGFubmVsKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJjaGFubmVsKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnN0ZXAoZGlyZWN0aW9uLCBza2lwU3ViY2hhbm5lbCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjp0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT50dW5lKGNoYW5uZWwsIHN1YkNoYW5uZWwpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6Y2FuY2VsKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5jYW5jZWwoKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPmdldFByb2dyYW1JbmZvcm1hdGlvbihpbmZvKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86Omhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5oYXNDb250cm9sKGhhc0NvbnRyb2wpOwotfQotCi0KLS8vIEJwUmFkaW9DbGllbnQKLXZvaWQgUmFkaW86Om9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgZXZlbnQgbGF5b3V0IGluIHNoYXJlZCBtZW1vcnkgaXM6Ci0gICAgLy8gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgYnl0ZXMgOiB0aGUgZXZlbnQgaXRzZWxmCi0gICAgLy8gNCBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBzaXplIG9yIDAKLSAgICAvLyBOIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ldGFkYXRhIGlmIHByZXNlbnQKLSAgICBzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCByYWRpb19ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7Ci0gICAgdWludDMyX3QgbWV0YWRhdGFPZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSArIHNpemVvZih1aW50MzJfdCk7Ci0gICAgdWludDMyX3QgbWV0YWRhdGFTaXplID0gKih1aW50MzJfdCAqKSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQgLSBzaXplb2YodWludDMyX3QpKTsKLQotICAgIC8vIHJlc3RvcmUgbG9jYWwgbWV0YWRhdGEgcG9pbnRlciBmcm9tIG9mZnNldAotICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKLSAgICBjYXNlIFJBRElPX0VWRU5UX1RVTkVEOgotICAgIGNhc2UgUkFESU9fRVZFTlRfQUZfU1dJVENIOgotICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgIGV2ZW50LT5pbmZvLm1ldGFkYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKHJhZGlvX21ldGFkYXRhX3QgKikoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV2ZW50LT5pbmZvLm1ldGFkYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgotICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgIGV2ZW50LT5tZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldmVudC0+bWV0YWRhdGEgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoZXZlbnQpOwotICAgIH0KLX0KLQotCi0vL0lCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci12b2lkIFJhZGlvOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dXKCJSYWRpbyBzZXJ2ZXIgYmluZGVyIERpZWQgIik7Ci0gICAgbUlSYWRpbyA9IDA7Ci0gICAgc3RydWN0IHJhZGlvX2V2ZW50IGV2ZW50OwotICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfU0VSVkVSX0RJRUQ7Ci0gICAgZXZlbnQuc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIG1DYWxsYmFjay0+b25FdmVudCgmZXZlbnQpOwotICAgIH0KLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggYzRmMWFmMy4uYzRhMGMwZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTEzOCw3ICsxMzgsNiBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7Ci0gICAgTE9HX0hJU1RfRkxVU0goKTsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtUHJldmlvdXM7CiAgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKaW5kZXggMmEyN2RmZC4uMzY2YTE2NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TW1hcFRyYWNrKCk7CiAKQEAgLTM5LDcgKzQwLDcgQEAKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgICBzdGF0aWMgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIE1tYXBUaHJlYWQ7CkBAIC01NSw1ICs1Niw2IEBACiAgICAgdmlydHVhbCBpbnQ2NF90IGZyYW1lc1JlbGVhc2VkKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIG9uVGltZXN0YW1wKGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApOwogCisgICAgcGlkX3QgbVBpZDsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGQ3YzA3MjguLjI3YzZkMzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTQ3NCw2ICs0NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CiAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpAQCAtNDk0LDYgKzQ5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwogICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCAzZjFhMGMwLi4xYzFhOTg5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMzAsNiArMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTQwLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CkBAIC0yNDAsNiArMjQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IDNmODNjYTguLmY4ZGE3ODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC01MCw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwpAQCAtMTAyLDYgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFJlY29yZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggMDg1YmUwMC4uNjMyOWYyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMTU0OSw2ICsxNTQ5LDcgQEAKICAgICAgICAgQUxPR1coIkFjdGl2ZVRyYWNrczxUPjo6YWRkIHRyYWNrICVwIGFscmVhZHkgdGhlcmUiLCB0cmFjay5nZXQoKSk7CiAgICAgICAgIHJldHVybiBpbmRleDsKICAgICB9CisgICAgbG9nVHJhY2soImFkZCIsIHRyYWNrKTsKICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbisrOwogICAgIG1MYXRlc3RBY3RpdmVUcmFjayA9IHRyYWNrOwogICAgICsrbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOwpAQCAtMTU2Miw2ICsxNTYzLDcgQEAKICAgICAgICAgQUxPR1coIkFjdGl2ZVRyYWNrczxUPjo6cmVtb3ZlIG5vbmV4aXN0ZW50IHRyYWNrICVwIiwgdHJhY2suZ2V0KCkpOwogICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQorICAgIGxvZ1RyYWNrKCJyZW1vdmUiLCB0cmFjayk7CiAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24rKzsKICAgICAtLW1CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKICAgICAvLyBtTGF0ZXN0QWN0aXZlVHJhY2sgaXMgbm90IGNsZWFyZWQgZXZlbiBpZiBpcyB0aGUgc2FtZSBhcyB0cmFjay4KQEAgLTE1NzIsNiArMTU3NCw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6QWN0aXZlVHJhY2tzPFQ+OjpjbGVhcigpIHsKICAgICBmb3IgKGNvbnN0IHNwPFQ+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wQXVkaW8odHJhY2stPnVpZCgpKTsKKyAgICAgICAgbG9nVHJhY2soImNsZWFyIiwgdHJhY2spOwogICAgIH0KICAgICBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb24gPSBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbjsKICAgICBtQWN0aXZlVHJhY2tzLmNsZWFyKCk7CkBAIC0xNjEwLDYgKzE2MTMsMTYgQEAKICAgICB9CiB9CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkFjdGl2ZVRyYWNrczxUPjo6bG9nVHJhY2soCisgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lLCBjb25zdCBzcDxUPiAmdHJhY2spIGNvbnN0IHsKKyAgICBpZiAobUxvY2FsTG9nICE9IG51bGxwdHIpIHsKKyAgICAgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgZmFsc2UgLyogYWN0aXZlICovKTsKKyAgICAgICAgbUxvY2FsTG9nLT5sb2coIkFUOjolLTEwcyglcCkgJXMiLCBmdW5jTmFtZSwgdHJhY2suZ2V0KCksIHJlc3VsdC5zdHJpbmcoKSk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6YnJvYWRjYXN0X2woKQogewogICAgIC8vIFRocmVhZCBjb3VsZCBiZSBibG9ja2VkIHdhaXRpbmcgZm9yIGFzeW5jCkBAIC0xNjQ1LDYgKzE2NTgsNyBAQAogICAgICAgICBtU3VzcGVuZGVkKDApLCBtQnl0ZXNXcml0dGVuKDApLAogICAgICAgICBtRnJhbWVzV3JpdHRlbigwKSwKICAgICAgICAgbVN1c3BlbmRlZEZyYW1lcygwKSwKKyAgICAgICAgbUFjdGl2ZVRyYWNrcygmdGhpcy0+bUxvY2FsTG9nKSwKICAgICAgICAgLy8gbVN0cmVhbVR5cGVzW10gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYm9keQogICAgICAgICBtT3V0cHV0KG91dHB1dCksCiAgICAgICAgIG1MYXN0V3JpdGVUaW1lKC0xKSwgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKSwKQEAgLTE3MTIsOCArMTcyNiw2IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIFN0cmVhbSB2b2x1bWVzIGluIGRCOiAiKTsKQEAgLTE3NDAsOCArMTc1MiwxMCBAQAogICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKICAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKICAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwpAQCAtMTc1MCw4ICsxNzY0LDggQEAKICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBhY3RpdmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTE3NTksMTUgKzE3NzMsMTUgQEAKICAgICB9CiAgICAgaWYgKG51bWFjdGl2ZXNlZW4gIT0gbnVtYWN0aXZlKSB7CiAgICAgICAgIC8vIHNvbWUgdHJhY2tzIGluIHRoZSBhY3RpdmUgbGlzdCB3ZXJlIG5vdCBpbiB0aGUgdHJhY2tzIGxpc3QKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjAxOCw3ICsyMDMyLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQpOwogCiAgICAgICAgIGxTdGF0dXMgPSB0cmFjayAhPSAwID8gdHJhY2stPmluaXRDaGVjaygpIDogKHN0YXR1c190KSBOT19NRU1PUlk7CkBAIC0yMTc3LDEwICsyMTkyLDYgQEAKICAgICAgICAgICAgIGNoYWluLT5pbmNBY3RpdmVUcmFja0NudCgpOwogICAgICAgICB9CiAKLSAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBhcnJheXNpemUoYnVmZmVyKSwgZmFsc2UgLyogYWN0aXZlICovKTsKLSAgICAgICAgbUxvY2FsTG9nLmxvZygiYWRkVHJhY2tfbCAgICAoJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOyAvLyBsb2cgZm9yIGFuYWx5c2lzCi0KICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgfQogCkBAIC0yMjA3LDkgKzIyMTgsOSBAQAogewogICAgIHRyYWNrLT50cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX1BSRVNFTlRBVElPTl9DT01QTEVURSk7CiAKLSAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tfbCAoJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOyAvLyBsb2cgZm9yIGFuYWx5c2lzCisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCByZXN1bHQuc3RyaW5nKCkpOwogCiAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIGRlbGV0ZVRyYWNrTmFtZV9sKHRyYWNrLT5uYW1lKCkpOwpAQCAtMzQwOSwxMCArMzQyMCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBpbmFjdGl2ZSBidXQgbm90IHRlcm1pbmF0ZWQKLSAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tzX2woJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTkzMCw3ICs1OTM3LDkgQEAKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDoKICAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCwgc3lzdGVtUmVhZHkpLAotICAgIG1JbnB1dChpbnB1dCksIG1Sc21wSW5CdWZmZXIoTlVMTCksCisgICAgbUlucHV0KGlucHV0KSwKKyAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpLAorICAgIG1Sc21wSW5CdWZmZXIoTlVMTCksCiAgICAgLy8gbVJzbXBJbkZyYW1lcywgbVJzbXBJbkZyYW1lc1AyLCBhbmQgbVJzbXBJbkZyYW1lc09BIGFyZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICBtUnNtcEluUmVhcigwKQogI2lmZGVmIFRFRV9TSU5LCkBAIC02NzAwLDcgKzY3MDksOCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgICAgIHRyYWNrID0gbmV3IFJlY29yZFRyYWNrKHRoaXMsIGNsaWVudCwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBOVUxMLCBzZXNzaW9uSWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2Vzc2lvbklkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOwpAQCAtNjg5OCw2ICs2OTA4LDEwIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlbW92ZVRyYWNrX2woY29uc3Qgc3A8UmVjb3JkVHJhY2s+JiB0cmFjaykKIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIGZhbHNlIC8qIGFjdGl2ZSAqLyk7CisgICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tfbCAoJXApICVzIiwgdHJhY2suZ2V0KCksIHJlc3VsdC5zdHJpbmcoKSk7CisKICAgICBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CiAgICAgLy8gbmVlZCBhbnl0aGluZyByZWxhdGVkIHRvIGVmZmVjdHMgaGVyZT8KICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKQEAgLTY5MTEsNiArNjkyNSw4IEBACiAgICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAgICAgZHVtcFRyYWNrcyhmZCwgYXJncyk7CiAgICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7CisgICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7CisgICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTY5MjQsNiArNjk0MCwxMiBAQAogICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQorCisgICAgaWYgKGlucHV0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFsIHN0cmVhbSBkdW1wOlxuIik7CisgICAgICAgICh2b2lkKWlucHV0LT5zdHJlYW0tPmR1bXAoZmQpOworICAgIH0KKwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgY2FwdHVyZSB0aHJlYWQ6ICVzXG4iLCBoYXNGYXN0Q2FwdHVyZSgpID8gInllcyIgOiAibm8iKTsKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsYWJsZTogJXNcbiIsIG1GYXN0VHJhY2tBdmFpbCA/ICJ5ZXMiIDogIm5vIik7CiAKQEAgLTY5MzgsMTYgKzY5NjAsMTUgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0KICAgICBzaXplX3QgbnVtdHJhY2tzID0gbVRyYWNrcy5zaXplKCk7CiAgICAgc2l6ZV90IG51bWFjdGl2ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOwogICAgIHNpemVfdCBudW1hY3RpdmVzZWVuID0gMDsKICAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiICAgICI7CiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICV6dSBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOworICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CiAgICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwpAQCAtNjk1Niw4ICs2OTc3LDggQEAKICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBhY3RpdmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTY5NjUsMTUgKzY5ODYsMTUgQEAKICAgICB9CiAKICAgICBpZiAobnVtYWN0aXZlc2VlbiAhPSBudW1hY3RpdmUpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTc1NTUsNyArNzU3Niw4IEBACiAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmh3RGV2LCBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSwKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBNTUFQLCBzeXN0ZW1SZWFkeSksCi0gICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldikKKyAgICAgIG1IYWxTdHJlYW0oc3RyZWFtKSwgbUhhbERldmljZShod0Rldi0+aHdEZXZpY2UoKSksIG1BdWRpb0h3RGV2KGh3RGV2KSwKKyAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZykKIHsKICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgcmVhZEhhbFBhcmFtZXRlcnNfbCgpOwpAQCAtNzcwNSw3ICs3NzI3LDggQEAKICAgICB9CiAKICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFVpZCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBjbGllbnQuY2xpZW50UGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJZCk7CiAKICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CiAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOwpAQCAtODE3Niw2ICs4MTk5LDggQEAKICAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKICAgICBkdW1wVHJhY2tzKGZkLCBhcmdzKTsKICAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKKyAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTgxOTIsMTggKzgyMTcsMTcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOwotICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3MiLCBudW10cmFja3MpOworICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3NcbiIsIG51bXRyYWNrcyk7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIlxuIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCA5ZGIxOWQ2Li5jYzExZGRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTUwOSw5ICs1MDksMTAgQEAKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICAgICAgICAgICAgICBjbGFzcyBBY3RpdmVUcmFja3MgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZlVHJhY2tzKCkKKyAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQgQWN0aXZlVHJhY2tzKFNpbXBsZUxvZyAqbG9jYWxMb2cgPSBudWxscHRyKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbigwKQogICAgICAgICAgICAgICAgICAgICAgICAgLCBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICwgbUxvY2FsTG9nKGxvY2FsTG9nKQogICAgICAgICAgICAgICAgICAgICB7IH0KIAogICAgICAgICAgICAgICAgICAgICB+QWN0aXZlVHJhY2tzKCkgewpAQCAtNTYzLDYgKzU2NCw4IEBACiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICB1cGRhdGVQb3dlclN0YXRlKHNwPFRocmVhZEJhc2U+IHRocmVhZCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgICAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBsb2dUcmFjayhjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3Qgc3A8VD4gJnRyYWNrKSBjb25zdDsKKwogICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8dWlkX3Q+IGdldFdha2VMb2NrVWlkcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3Rvcjx1aWRfdD4gd2FrZUxvY2tVaWRzOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcDxUPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CkBAIC01NzcsNiArNTgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIHdwPFQ+ICAgICAgICAgICAgICAgbUxhdGVzdEFjdGl2ZVRyYWNrOyAvLyBsYXRlc3QgdHJhY2sgYWRkZWQgdG8gQWN0aXZlVHJhY2tzCisgICAgICAgICAgICAgICAgICAgIFNpbXBsZUxvZyAqIGNvbnN0ICAgbUxvY2FsTG9nOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgbUxvY2FsTG9nOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGNiNTQwY2EuLmQ0Y2UwYjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTYxLDYgKzYxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQsCkBAIC04Miw2ICs4Myw3IEBACiAKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGdldEJ1ZmZlcnMoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyTWVtb3J5OyB9CiAgICAgICAgICAgICB2b2lkKiAgICAgICBidWZmZXIoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyOyB9CisgICAgICAgICAgICBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgPSAwOwogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQpAQCAtMTMzLDYgKzEzNSw0MCBAQAogICAgICAgICBtVGVybWluYXRlZCA9IHRydWU7CiAgICAgfQogCisgICAgLy8gVXBwZXIgY2FzZSBjaGFyYWN0ZXJzIGFyZSBmaW5hbCBzdGF0ZXMuCisgICAgLy8gTG93ZXIgY2FzZSBjaGFyYWN0ZXJzIGFyZSB0cmFuc2l0b3J5LgorICAgIGNvbnN0IGNoYXIgKmdldFRyYWNrU3RhdGVTdHJpbmcoKSBjb25zdCB7CisgICAgICAgIGlmIChpc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuICJUICI7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBJRExFOgorICAgICAgICAgICAgcmV0dXJuICJJICI7CisgICAgICAgIGNhc2UgU1RPUFBJTkdfMTogLy8gZm9yIEZhc3QgYW5kIE9mZmxvYWQKKyAgICAgICAgICAgIHJldHVybiAiczEiOworICAgICAgICBjYXNlIFNUT1BQSU5HXzI6IC8vIGZvciBGYXN0IGFuZCBPZmZsb2FkCisgICAgICAgICAgICByZXR1cm4gInMyIjsKKyAgICAgICAgY2FzZSBTVE9QUEVEOgorICAgICAgICAgICAgcmV0dXJuICJTICI7CisgICAgICAgIGNhc2UgUkVTVU1JTkc6CisgICAgICAgICAgICByZXR1cm4gInIgIjsKKyAgICAgICAgY2FzZSBBQ1RJVkU6CisgICAgICAgICAgICByZXR1cm4gIkEgIjsKKyAgICAgICAgY2FzZSBQQVVTSU5HOgorICAgICAgICAgICAgcmV0dXJuICJwICI7CisgICAgICAgIGNhc2UgUEFVU0VEOgorICAgICAgICAgICAgcmV0dXJuICJQICI7CisgICAgICAgIGNhc2UgRkxVU0hFRDoKKyAgICAgICAgICAgIHJldHVybiAiRiAiOworICAgICAgICBjYXNlIFNUQVJUSU5HXzE6IC8vIGZvciBSZWNvcmRUcmFjaworICAgICAgICAgICAgcmV0dXJuICJyMSI7CisgICAgICAgIGNhc2UgU1RBUlRJTkdfMjogLy8gZm9yIFJlY29yZFRyYWNrCisgICAgICAgICAgICByZXR1cm4gInIyIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiPyAiOworICAgICAgICB9CisgICAgfQorCiAgICAgYm9vbCBpc091dCgpIGNvbnN0IHsgcmV0dXJuIG1Jc091dDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBmb3IgVHJhY2ssIGZhbHNlIGZvciBSZWNvcmRUcmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgYSB0cmFjayB0eXBlIGlmIG5lZWRlZCBsYXRlcgpAQCAtMTQ0LDYgKzE4MCw3IEBACiAgICAgc3A8SU1lbW9yeT4gICAgICAgICBtQnVmZmVyTWVtb3J5OyAgLy8gY3VycmVudGx5IG5vbi0wIGZvciBmYXN0IFJlY29yZFRyYWNrIG9ubHkKICAgICB2b2lkKiAgICAgICAgICAgICAgIG1CdWZmZXI7ICAgIC8vIHN0YXJ0IG9mIHRyYWNrIGJ1ZmZlciwgdHlwaWNhbGx5IGluIHNoYXJlZCBtZW1vcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdCBmb3IgT3V0cHV0VHJhY2sgd2hlbiBpdCBpcyBpbiBsb2NhbCBtZW1vcnkKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAvLyBzaXplIG9mIG1CdWZmZXIgaW4gYnl0ZXMKICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCiAgICAgdHJhY2tfc3RhdGUgICAgICAgICBtU3RhdGU7CiAgICAgY29uc3QgdWludDMyX3QgICAgICBtU2FtcGxlUmF0ZTsgICAgLy8gaW5pdGlhbCBzYW1wbGUgcmF0ZSBvbmx5OyBmb3IgdHJhY2tzIHdoaWNoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDk3NjNiZjIuLjBmMjUxNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC01MCwxMCArNTAsNiBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAotLy8gVE9ETyBtb3ZlIHRvIGEgY29tbW9uIGhlYWRlciAgKEFsc28gc2hhcmVkIHdpdGggQXVkaW9UcmFjay5jcHApCi0jZGVmaW5lIE5BTk9TX1BFUl9TRUNPTkQgICAgMTAwMDAwMDAwMAotI2RlZmluZSBUSU1FX1RPX05BTk9TKHRpbWUpICgodWludDY0X3QpKHRpbWUpLnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQgKyAodGltZSkudHZfbnNlYykKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MSw2ICs2Nyw3IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgYm9vbCBpc091dCwKQEAgLTgxLDcgKzc4LDcgQEAKICAgICAgICAgbVRocmVhZCh0aHJlYWQpLAogICAgICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgICAgIG1DYmxrKE5VTEwpLAotICAgICAgICAvLyBtQnVmZmVyCisgICAgICAgIC8vIG1CdWZmZXIsIG1CdWZmZXJTaXplCiAgICAgICAgIG1TdGF0ZShJRExFKSwKICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCiAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKQEAgLTExMywxNSArMTEwLDIyIEBACiAKICAgICAvLyBBTE9HRCgiQ3JlYXRpbmcgdHJhY2sgd2l0aCAlZCBidWZmZXJzIEAgJWQgYnl0ZXMiLCBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSk7CiAKLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlciA9PSBOVUxMID8gcm91bmR1cChmcmFtZUNvdW50KSA6IGZyYW1lQ291bnQ7CisgICAgc2l6ZV90IG1pbkJ1ZmZlclNpemUgPSBidWZmZXIgPT0gTlVMTCA/IHJvdW5kdXAoZnJhbWVDb3VudCkgOiBmcmFtZUNvdW50OwogICAgIC8vIGNoZWNrIG92ZXJmbG93IHdoZW4gY29tcHV0aW5nIGJ1ZmZlclNpemUgZHVlIHRvIG11bHRpcGxpY2F0aW9uIGJ5IG1GcmFtZVNpemUuCi0gICAgaWYgKGJ1ZmZlclNpemUgPCBmcmFtZUNvdW50ICAvLyByb3VuZHVwIHJvdW5kcyBkb3duIGZvciB2YWx1ZXMgYWJvdmUgVUlOVF9NQVggLyAyCisgICAgaWYgKG1pbkJ1ZmZlclNpemUgPCBmcmFtZUNvdW50ICAvLyByb3VuZHVwIHJvdW5kcyBkb3duIGZvciB2YWx1ZXMgYWJvdmUgVUlOVF9NQVggLyAyCiAgICAgICAgICAgICB8fCBtRnJhbWVTaXplID09IDAgICAvLyBmb3JtYXQgbmVlZHMgdG8gYmUgY29ycmVjdAotICAgICAgICAgICAgfHwgYnVmZmVyU2l6ZSA+IFNJWkVfTUFYIC8gbUZyYW1lU2l6ZSkgeworICAgICAgICAgICAgfHwgbWluQnVmZmVyU2l6ZSA+IFNJWkVfTUFYIC8gbUZyYW1lU2l6ZSkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM0NzQ5NTcxIik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYnVmZmVyU2l6ZSAqPSBtRnJhbWVTaXplOworICAgIG1pbkJ1ZmZlclNpemUgKj0gbUZyYW1lU2l6ZTsKKworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBidWZmZXJTaXplID0gbWluQnVmZmVyU2l6ZTsgLy8gYWxsb2NhdGVkIGhlcmUuCisgICAgfSBlbHNlIGlmIChtaW5CdWZmZXJTaXplID4gYnVmZmVyU2l6ZSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM4MzQwMTE3Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgIGlmIChidWZmZXIgPT0gTlVMTCAmJiBhbGxvYyA9PSBBTExPQ19DQkxLKSB7CkBAIC0xNzcsNiArMTgxLDcgQEAKICAgICAgICAgICAgIC8vIEl0IHNob3VsZCByZWZlcmVuY2VzIHRoZSBidWZmZXIgdmlhIHRoZSBwaXBlLgogICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB0byBkZXRlY3QgaW5jb3JyZWN0IHVzYWdlIG9mIHRoZSBidWZmZXIsIHdlIHNldCBtQnVmZmVyIHRvIE5VTEwuCiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGJ1ZmZlclNpemUgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUxMT0NfQ0JMSzoKICAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBidWZmZXJzCkBAIC0xOTYsNyArMjAxLDEwIEBACiAgICAgICAgIGNhc2UgQUxMT0NfTk9ORToKICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIChpbnQpYWxsb2MpOwogICAgICAgICB9CisgICAgICAgIG1CdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKIAogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgIGlmIChtVGVlU2lua1RyYWNrRW5hYmxlZCkgewpAQCAtMzY4LDYgKzM3Niw3IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTM3Niw2ICszODUsNyBAQAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA6IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnNpemUoKSA6IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgdHJ1ZSAvKmlzT3V0Ki8sCiAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX1BBVENIKSA/ICggYnVmZmVyID09IE5VTEwgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpIDogQUxMT0NfQ0JMSywKICAgICAgICAgICAgICAgICAgIHR5cGUsIHBvcnRJZCksCkBAIC00MTEsMjEgKzQyMSw2IEBACiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIG1GcmFtZVNpemUsICFpc0V4dGVybmFsVHJhY2soKSwgc2FtcGxlUmF0ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gSXMgdGhlIHNoYXJlZCBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplPwotICAgICAgICAvLyAoZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpIGlzIDw9IFNJWkVfTUFYLCBjaGVja2VkIGluIFRyYWNrQmFzZS4KLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlci0+c2l6ZSgpIDwgZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpIHsKLSAgICAgICAgICAgIC8vIFdvcmthcm91bmQ6IGNsZWFyIG91dCBtQ2JsayB0byBpbmRpY2F0ZSB0cmFjayBoYXNuJ3QgYmVlbiBwcm9wZXJseSBjcmVhdGVkLgotICAgICAgICAgICAgbUNibGstPn5hdWRpb190cmFja19jYmxrX3QoKTsgICAvLyBkZXN0cm95IG91ciBzaGFyZWQtc3RydWN0dXJlLgotICAgICAgICAgICAgaWYgKG1DbGllbnQgPT0gMCkgewotICAgICAgICAgICAgICAgIGZyZWUobUNibGspOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNibGsgPSBOVUxMOwotCi0gICAgICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7IC8vIHJlbGVhc2Ugc2hhcmVkIGJ1ZmZlciBlYXJseQotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzODM0MDExNyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7CiAgICAgfQpAQCAtNTAzLDU4ICs0OTgsNDAgQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICAgTmFtZSBBY3RpdmUgQ2xpZW50IFR5cGUgICAgICBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBmQ291bnQgUyBGIFNSYXRlICAiCi0gICAgICAgICAgICAgICAgICAiTCBkQiAgUiBkQiAgVlMgZEIgICAgU2VydmVyIE1haW4gYnVmICBBdXggYnVmIEZsYWdzIFVuZEZybUNudCAgRmx1c2hlZFxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiVCBOYW1lIEFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAiCisgICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKKyAgICAgICAgICAgICAgICAgICJTVCAgTCBkQiAgUiBkQiAgVlMgZEIgIgorICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkICIKKyAgICAgICAgICAgICAgICAgICJNYWluIEJ1ZiAgQXV4IEJ1ZlxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKLSAgICBpZiAoaXNGYXN0VHJhY2soKSkgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBGICUyZCIsIG1GYXN0SW5kZXgpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPj0gQXVkaW9NaXhlcjo6VFJBQ0swKSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgICU0ZCIsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBub25lIik7Ci0gICAgfQotICAgIHRyYWNrX3N0YXRlIHN0YXRlID0gbVN0YXRlOwotICAgIGNoYXIgc3RhdGVDaGFyOwotICAgIGlmIChpc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICBzdGF0ZUNoYXIgPSAnVCc7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIElETEU6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnSSc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9QUElOR18xOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ3MnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBJTkdfMjoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICc1JzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUT1BQRUQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnUyc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVNVTUlORzoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdSJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFDVElWRToKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdBJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBBVVNJTkc6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAncCc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQVVTRUQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnUCc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGTFVTSEVEOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ0YnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnPyc7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBjaGFyIHRyYWNrVHlwZTsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgY2FzZSBUWVBFX0RFRkFVTFQ6CisgICAgY2FzZSBUWVBFX09VVFBVVDoKKyAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgdHJhY2tUeXBlID0gJ1MnOyAvLyBzdGF0aWMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNrVHlwZSA9ICcgJzsgLy8gbm9ybWFsCiAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX1BBVENIOgorICAgICAgICB0cmFja1R5cGUgPSAnUCc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRyYWNrVHlwZSA9ICc/JzsKICAgICB9CisKKyAgICBpZiAoaXNGYXN0VHJhY2soKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWMgJTNkIiwgdHJhY2tUeXBlLCBtRmFzdEluZGV4KTsKKyAgICB9IGVsc2UgaWYgKG1OYW1lID49IEF1ZGlvTWl4ZXI6OlRSQUNLMCkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyAlNGQiLCB0cmFja1R5cGUsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBub25lIiwgdHJhY2tUeXBlKTsKKyAgICB9CisKICAgICBjaGFyIG5vd0luVW5kZXJydW47CiAgICAgc3dpdGNoIChtT2JzZXJ2ZWRVbmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCkgewogICAgIGNhc2UgVU5ERVJSVU5fRlVMTDoKQEAgLTU3MSwzMSArNTQ4LDc1IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHN0ZDo6cGFpcjxmbG9hdCAvKiB2b2x1bWUgKi8sIGJvb2wgLyogYWN0aXZlICovPiB2c1ZvbHVtZSA9IG1Wb2x1bWVIYW5kbGVyLT5nZXRMYXN0Vm9sdW1lKCk7Ci0gICAgc25wcmludGYoJmJ1ZmZlcls4XSwgc2l6ZSAtIDgsICIgJTZzICU2dSAlNHUgJTA4WCAlMDhYICU3dSAlNnp1ICUxYyAlMWQgJTV1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiU1LjJnICU1LjJnICU1LjJnJWMgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4elggJTA4elggMHglMDNYICU5dSVjICU3dVxuIiwKKyAgICBjaGFyIGZpbGxpbmdTdGF0dXM7CisgICAgc3dpdGNoIChtRmlsbGluZ1VwU3RhdHVzKSB7CisgICAgY2FzZSBGU19JTlZBTElEOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ0knOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZTX0ZJTExJTkc6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnZic7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlNfRklMTEVEOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ0YnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZTX0FDVElWRToKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICdBJzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICc/JzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gY2xpcCBmcmFtZXNSZWFkeVNhZmUgdG8gbWF4IHJlcHJlc2VudGF0aW9uIGluIGR1bXAKKyAgICBjb25zdCBzaXplX3QgZnJhbWVzUmVhZHlTYWZlID0KKyAgICAgICAgICAgIHN0ZDo6bWluKG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5U2FmZSgpLCAoc2l6ZV90KTk5OTk5OTk5KTsKKworICAgIC8vIG9idGFpbiB2b2x1bWVzCisgICAgY29uc3QgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKKyAgICBjb25zdCBzdGQ6OnBhaXI8ZmxvYXQgLyogdm9sdW1lICovLCBib29sIC8qIGFjdGl2ZSAqLz4gdnNWb2x1bWUgPQorICAgICAgICAgICAgbVZvbHVtZUhhbmRsZXItPmdldExhc3RWb2x1bWUoKTsKKworICAgIC8vIE91ciBlZmZlY3RpdmUgZnJhbWUgY291bnQgaXMgb2J0YWluZWQgYnkgU2VydmVyUHJveHk6OmdldEJ1ZmZlclNpemVJbkZyYW1lcygpCisgICAgLy8gYXMgaXQgbWF5IGJlIHJlZHVjZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplSW5GcmFtZXMgPSAoc2l6ZV90KW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldEJ1ZmZlclNpemVJbkZyYW1lcygpOworICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlciBzaXplIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHRoZSBhcHAuCisgICAgY29uc3QgY2hhciBtb2RpZmllZEJ1ZmZlckNoYXIgPSBidWZmZXJTaXplSW5GcmFtZXMgPCBtRnJhbWVDb3VudAorICAgICAgICAgICAgPyAncicgLyogYnVmZmVyIHJlZHVjZWQgKi86IGJ1ZmZlclNpemVJbkZyYW1lcyA+IG1GcmFtZUNvdW50CisgICAgICAgICAgICAgICAgICAgID8gJ2UnIC8qIGVycm9yICovIDogJyAnIC8qIGlkZW50aWNhbCAqLzsKKworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU3cyAlNnUgJTd1ICUycyAweCUwM1ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUydSAlNS4yZyAlNS4yZyAlNS4yZyVjICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICU2enUlYyAlNnp1ICVjICU5dSVjICU3dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4elggJTA4elhcbiIsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKKyAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCisKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgbUZyYW1lQ291bnQsCi0gICAgICAgICAgICBzdGF0ZUNoYXIsCi0gICAgICAgICAgICBtRmlsbGluZ1VwU3RhdHVzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpLAorCisgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKHZzVm9sdW1lLmZpcnN0KSwgLy8gVm9sdW1lU2hhcGVyKHMpIHRvdGFsIHZvbHVtZQogICAgICAgICAgICAgdnNWb2x1bWUuc2Vjb25kID8gJ0EnIDogJyAnLCAgLy8gaWYgYW55IFZvbHVtZVNoYXBlcnMgYWN0aXZlCisKICAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAotICAgICAgICAgICAgKHNpemVfdCltTWFpbkJ1ZmZlciwgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4Ci0gICAgICAgICAgICAoc2l6ZV90KW1BdXhCdWZmZXIsICAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKLSAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCisgICAgICAgICAgICBidWZmZXJTaXplSW5GcmFtZXMsCisgICAgICAgICAgICBtb2RpZmllZEJ1ZmZlckNoYXIsCisgICAgICAgICAgICBmcmFtZXNSZWFkeVNhZmUsCisgICAgICAgICAgICBmaWxsaW5nU3RhdHVzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0VW5kZXJydW5GcmFtZXMoKSwKICAgICAgICAgICAgIG5vd0luVW5kZXJydW4sCi0gICAgICAgICAgICAodW5zaWduZWQpbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzRmx1c2hlZCgpICUgMTAwMDAwMDApOyAvLyA3IGRpZ2l0cworICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwLAorCisgICAgICAgICAgICAoc2l6ZV90KW1NYWluQnVmZmVyLCAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKKyAgICAgICAgICAgIChzaXplX3QpbUF1eEJ1ZmZlciAgIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAorICAgICAgICAgICAgKTsKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNhbXBsZVJhdGUoKSBjb25zdCB7CkBAIC0xMjM1LDcgKzEyNTYsOCBAQAogICAgICAgICAgICAgdWlkX3QgdWlkKQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX1BBVENILAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICBOVUxMLCAwLCBBVURJT19TRVNTSU9OX05PTkUsIHVpZCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCB1aWQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgIFRZUEVfT1VUUFVUKSwKICAgICBtQWN0aXZlKGZhbHNlKSwgbVNvdXJjZVRocmVhZChzb3VyY2VUaHJlYWQpCiB7CkBAIC0xMzUxLDcgKzEzNzMsOSBAQAogICAgICAgICAgICAgaWYgKG1CdWZmZXJRdWV1ZS5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUucmVtb3ZlQXQoMCk7CiAgICAgICAgICAgICAgICAgZnJlZShwSW5CdWZmZXItPm1CdWZmZXIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHBJbkJ1ZmZlciAhPSAmaW5CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBJbkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJXp1IiwgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDMwLDEwICsxNDU0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgYnVmZmVyLCAwLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCisgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSkpCiB7CiAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwpAQCAtMTU2NywxMyArMTU5MywxNCBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyppc091dCovLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLywKICAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfREVGQVVMVCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSA/IEFMTE9DX1BJUEUgOiBBTExPQ19DQkxLKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVmZmVyID09IE5VTEwpID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSwKQEAgLTE3MDEsMjIgKzE3MjgsMjggQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgIEFjdGl2ZSBDbGllbnQgRm10IENobiBtYXNrIFNlc3Npb24gUyAgIFNlcnZlciBmQ291bnQgU1JhdGVcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIkFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgICBTZXJ2ZXIgRnJtQ250XG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICAlNnMgJTZ1ICUzdSAlMDhYICU3dSAlMWQgJTA4WCAlNnp1ICU1dVxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyU1cyAlNnUgJTd1ICUycyAweCUwM1ggIgorICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgorICAgICAgICAgICAgIiUwOFggJTZ6dVxuIiwKKyAgICAgICAgICAgIGlzRmFzdFRyYWNrKCkgPyAnRicgOiAnICcsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCisgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAorCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgIG1TdGF0ZSwKLSAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAotICAgICAgICAgICAgbUZyYW1lQ291bnQsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKIAorICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCisgICAgICAgICAgICBtRnJhbWVDb3VudAorICAgICAgICAgICAgKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtMTc2Nyw5ICsxODAwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCiAgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBidWZmZXIsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSkpCiB7CiAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiByZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KQEAgLTE4MzQsMTEgKzE4NjgsMTUgQEAKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgTlVMTCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIDAsIE5VTEwsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAoc2l6ZV90KTAgLyogZnJhbWVDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKKyAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKiBpc091dCAqLywKICAgICAgICAgICAgICAgICAgIEFMTE9DX05PTkUsCi0gICAgICAgICAgICAgICAgICBUWVBFX0RFRkFVTFQsIHBvcnRJZCkKKyAgICAgICAgICAgICAgICAgIFRZUEVfREVGQVVMVCwgcG9ydElkKSwKKyAgICAgICAgbVBpZChwaWQpCiB7CiB9CiAKQEAgLTE4ODUsMTcgKzE5MjMsMTcgQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICAgQ2xpZW50IEZtdCBDaG4gbWFzayAgU1JhdGVcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIkNsaWVudCBTZXNzaW9uICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZVxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSBfX3VudXNlZCkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAgICAgICAgICAlNnUgJTN1ICAgICUwOFggJTV1XG4iLAotICAgICAgICAgICAgbVVpZCwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICUwOFggJTA4WCAlNnVcbiIsCisgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7Ci0KIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCAyZDg0MDI4Li44M2FhNmExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtOTAsMTAgKzkwLDYgQEAKICNkZWZpbmUgTE9HX0hJU1RfVFMoKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPmxvZ0hpc3RUUyhoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCiAKLS8vIGZsdXNoIGFsbCBoaXN0b2dyYW0KLSNkZWZpbmUgTE9HX0hJU1RfRkxVU0goKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPmxvZ0hpc3RGbHVzaChoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGV4dGVybiAiQyIgewogZXh0ZXJuIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyICp0bE5CTG9nV3JpdGVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKaW5kZXggYWQzNDBlNS4uNjU1NzFmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCkBAIC0yNCw3ICsyNCw4IEBACiAgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKICAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYmVmZmVjdHNjb25maWcKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCBjODY4MjA2Li43YjE5ZjU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTM0OSw4ICszNDksOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCmluZGV4IDE4ZmJhMjUuLjJlNjUzZTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgogI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00NCwxMyArNDUsMTMgQEAKIAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCi0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbjsgfQotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCljb25zdCB7IHJldHVybiBtSW5wdXRTb3VyY2U7IH0KKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb247IH0KKyAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSgpY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc291cmNlOyB9CiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5mb3JtYXQ7IH0KICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5zYW1wbGVfcmF0ZTsgfQogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5jaGFubmVsX21hc2s7IH0KICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9Ci0gICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQorICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnVpZDsgfQogICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3Q7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1Jc1NvdW5kVHJpZ2dlcjsgfQogICAgIHVpbnQzMl90IG9wZW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1PcGVuQ291bnQ7IH0gOwpAQCAtNjQsMTEgKzY1LDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKLSAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBtSW5wdXRTb3VyY2U7CisgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgbVJlY29yZENsaWVudEluZm87CiAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1Db25maWc7CiAgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7Ci0gICAgY29uc3QgdWlkX3QgbVVpZDsKICAgICBib29sICBtSXNTb3VuZFRyaWdnZXI7CiAgICAgdWludDMyX3QgIG1PcGVuQ291bnQ7CiAgICAgdWludDMyX3QgIG1BY3RpdmVDb3VudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCmluZGV4IGJlYTlmNGYuLjViNTdkM2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApAQCAtMzgsOSArMzgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKSA6Ci0gICAgbVNlc3Npb24oc2Vzc2lvbiksIG1JbnB1dFNvdXJjZShpbnB1dFNvdXJjZSksCisgICAgbVJlY29yZENsaWVudEluZm8oeyAudWlkID0gdWlkLCAuc2Vzc2lvbiA9IHNlc3Npb24sIC5zb3VyY2UgPSBpbnB1dFNvdXJjZX0pLAogICAgIG1Db25maWcoeyAuZm9ybWF0ID0gZm9ybWF0LCAuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlLCAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2t9KSwKLSAgICBtRmxhZ3MoZmxhZ3MpLCBtVWlkKHVpZCksIG1Jc1NvdW5kVHJpZ2dlcihpc1NvdW5kVHJpZ2dlciksCisgICAgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKICAgICBtT3BlbkNvdW50KDEpLCBtQWN0aXZlQ291bnQoMCksIG1Qb2xpY3lNaXgocG9saWN5TWl4KSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAogICAgIG1JbmZvUHJvdmlkZXIoTlVMTCkKIHsKQEAgLTkyLDcgKzkyLDcgQEAKICAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0UGF0Y2hIYW5kbGUoKSA6CiAgICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBtU2Vzc2lvbiwgbUlucHV0U291cmNlLAorICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmbVJlY29yZENsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLCAmZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDIsMTMgKzEwMiwxMyBAQAogCiBib29sIEF1ZGlvU2Vzc2lvbjo6bWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3QKIHsKLSAgICBpZiAob3RoZXItPnNlc3Npb24oKSA9PSBtU2Vzc2lvbiAmJgotICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtSW5wdXRTb3VyY2UgJiYKKyAgICBpZiAob3RoZXItPnNlc3Npb24oKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uICYmCisgICAgICAgIG90aGVyLT5pbnB1dFNvdXJjZSgpID09IG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZSAmJgogICAgICAgICBvdGhlci0+Zm9ybWF0KCkgPT0gbUNvbmZpZy5mb3JtYXQgJiYKICAgICAgICAgb3RoZXItPnNhbXBsZVJhdGUoKSA9PSBtQ29uZmlnLnNhbXBsZV9yYXRlICYmCiAgICAgICAgIG90aGVyLT5jaGFubmVsTWFzaygpID09IG1Db25maWcuY2hhbm5lbF9tYXNrICYmCiAgICAgICAgIG90aGVyLT5mbGFncygpID09IG1GbGFncyAmJgotICAgICAgICBvdGhlci0+dWlkKCkgPT0gbVVpZCkgeworICAgICAgICBvdGhlci0+dWlkKCkgPT0gbVJlY29yZENsaWVudEluZm8udWlkKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMzAsOCArMTMwLDcgQEAKICAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24sIG1JbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgJm1SZWNvcmRDbGllbnRJbmZvLCAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTQ0LDExICsxNDMsMTEgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIHNlc3Npb24gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzZXNzaW9uOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1TZXNzaW9uKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNlc3Npb246ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnVpZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaW5wdXQgc291cmNlOiAlZFxuIiwgc3BhY2VzLCAiIiwgbUlucHV0U291cmNlKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlucHV0IHNvdXJjZTogJWRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0OiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtQ29uZmlnLmZvcm1hdCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IGRiY2MwNzAuLjMxYzk1NzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTIyMCwxMSArMjIwLDExIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggNjU0NDY1ZC4uODRiMTA3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjAsOCArMjAsMTAgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzksMTEgKzQxLDE3IEBACiAKIEF1ZGlvUG9saWN5RWZmZWN0czo6QXVkaW9Qb2xpY3lFZmZlY3RzKCkKIHsKLSAgICAvLyBsb2FkIGF1dG9tYXRpYyBhdWRpbyBlZmZlY3QgbW9kdWxlcwotICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICBsb2FkQXVkaW9FZmZlY3RDb25maWcoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICBzdGF0dXNfdCBsb2FkUmVzdWx0ID0gbG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCk7CisgICAgaWYgKGxvYWRSZXN1bHQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gbG9hZCBYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24sIGZhbGxiYWNrIHRvIC5jb25mIik7CisgICAgICAgIC8vIGxvYWQgYXV0b21hdGljIGF1ZGlvIGVmZmVjdCBtb2R1bGVzCisgICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgICAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobG9hZFJlc3VsdCA+IDApIHsKKyAgICAgICAgQUxPR0UoIkVmZmVjdCBjb25maWcgaXMgcGFydGlhbGx5IGludmFsaWQsIHNraXBwZWQgJWQgZWxlbWVudHMiLCBsb2FkUmVzdWx0KTsKICAgICB9CiB9CiAKQEAgLTY4NSw2ICs2OTMsMjggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCkgeworICAgIGF1dG8gcmVzdWx0ID0gZWZmZWN0c0NvbmZpZzo6cGFyc2UoKTsKKyAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIGF1dG8gbG9hZFByb2Nlc3NpbmdDaGFpbiA9IFtdKGF1dG8mIHByb2Nlc3NpbmdDaGFpbiwgYXV0byYgc3RyZWFtcykgeworICAgICAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IHByb2Nlc3NpbmdDaGFpbikgeworICAgICAgICAgICAgYXV0byBlZmZlY3REZXNjcyA9IHN0ZDo6bWFrZV91bmlxdWU8RWZmZWN0RGVzY1ZlY3Rvcj4oKTsKKyAgICAgICAgICAgIGZvciAoYXV0byYgZWZmZWN0IDogc3RyZWFtLmVmZmVjdHMpIHsKKyAgICAgICAgICAgICAgICBlZmZlY3REZXNjcy0+bUVmZmVjdHMuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVmZmVjdERlc2N7ZWZmZWN0LmdldCgpLm5hbWUuY19zdHIoKSwgZWZmZWN0LmdldCgpLnV1aWR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbXMuYWRkKHN0cmVhbS50eXBlLCBlZmZlY3REZXNjcy5yZWxlYXNlKCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBsb2FkUHJvY2Vzc2luZ0NoYWluKHJlc3VsdC5wYXJzZWRDb25maWctPnByZXByb2Nlc3MsIG1JbnB1dFNvdXJjZXMpOworICAgIGxvYWRQcm9jZXNzaW5nQ2hhaW4ocmVzdWx0LnBhcnNlZENvbmZpZy0+cG9zdHByb2Nlc3MsIG1PdXRwdXRTdHJlYW1zKTsKKyAgICAvLyBDYXN0aW5nIGZyb20gc3NpemVfdCB0byBzdGF0dXNfdCBpcyBwcm9iYWJseSBzYWZlLCB0aGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAyXjMxIGVycm9ycworICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudDsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkQXVkaW9FZmZlY3RDb25maWcoY29uc3QgY2hhciAqcGF0aCkKIHsKICAgICBjbm9kZSAqcm9vdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDBjNzRkODcuLjU5ZDVkMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtMTU1LDcgKzE1NSw4IEBACiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1OYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgLy8gUGFyc2UgYXVkaW9fZWZmZWN0cy5jb25mCi0gICAgc3RhdHVzX3QgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdENvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsgLy8gVE9ETzogYWRkIGxlZ2FjeSBpbiB0aGUgbmFtZQorICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdFhtbENvbmZpZygpOyAvLyBUT0RPOiByZW1vdmUgIlhtbCIgaW4gdGhlIG5hbWUKIAogICAgIC8vIExvYWQgYWxsIGVmZmVjdHMgZGVzY3JpcHRvcnMgaW4gY29uZmlndXJhdGlvbiBmaWxlCiAgICAgc3RhdHVzX3QgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggYzRmNjM2Ny4uYjQxNzYzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMTg1LDIxICsxODUsMjEgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KIH0KQEAgLTI2NywxMiArMjY3LDEyIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgewotICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQogfQpAQCAtNTQ0LDggKzU0NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsIGRhdGEtPm1TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Tb3VyY2UsICZkYXRhLT5tQ2xpZW50Q29uZmlnLCAmZGF0YS0+bURldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsICZkYXRhLT5tQ2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtODEwLDcgKzgxMCw3IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKQEAgLTgxOCwxNCArODE4LDEzIEBACiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU7CiAgICAgUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZURhdGEgKmRhdGEgPSBuZXcgUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZURhdGEoKTsKICAgICBkYXRhLT5tRXZlbnQgPSBldmVudDsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgZGF0YS0+bVNvdXJjZSA9IHNvdXJjZTsKKyAgICBkYXRhLT5tQ2xpZW50SW5mbyA9ICpjbGllbnRJbmZvOwogICAgIGRhdGEtPm1DbGllbnRDb25maWcgPSAqY2xpZW50Q29uZmlnOwogICAgIGRhdGEtPm1EZXZpY2VDb25maWcgPSAqZGV2aWNlQ29uZmlnOwogICAgIGRhdGEtPm1QYXRjaEhhbmRsZSA9IHBhdGNoSGFuZGxlOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBldmVudCwgc291cmNlKTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlY29yZGluZyBjb25maWd1cmF0aW9uIHVwZGF0ZSBldmVudCAlZCwgc291cmNlICVkIHVpZCAldSIsCisgICAgICAgICAgICBldmVudCwgY2xpZW50SW5mby0+c291cmNlLCBjbGllbnRJbmZvLT51aWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCAzNTU0MmYxLi4zOGQ0YjE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIyOCwxMSArMjI4LDExIEBACiAKICAgICAgICAgICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgdm9pZCBkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKIHByaXZhdGU6CkBAIC0zMDYsOCArMzA2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwpAQCAtNDA0LDggKzQwNCw3IEBACiAgICAgICAgIGNsYXNzIFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBpbnQgbUV2ZW50OwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKKyAgICAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1DbGllbnRJbmZvOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1DbGllbnRDb25maWc7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbURldmljZUNvbmZpZzsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKQEAgLTUxOCw3ICs1MTcsNyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKQEAgLTU0MCw4ICs1MzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAppbmRleCA4NzZjNjg1Li5mM2JiMzVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKQEAgLTQwNCw2ICs0MDQsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGR1bXBSZWNlbnQocmVzdWx0LCB0c19zaW5jZSwgb25seSk7CiAgICAgfQorICAgIGZyZWUoKHZvaWQqKW9ubHkpOworICAgIG9ubHk9TlVMTDsKIAogCiAgICAgaWYgKGNsZWFyKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCA2YjMwZGI2Li4yZGFhODI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTE3LDcgKzE3LDYgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgTWVkaWFDYXNTZXJ2aWNlLmNwcCBcCiAgICAgTWVkaWFEcm1TZXJ2aWNlLmNwcCBcCiAgICAgbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oIGIvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2YxMTE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL0ZhY3RvcnlMb2FkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9DQVNfTE9BREVSX0hfCi0jZGVmaW5lIE1FRElBX0NBU19MT0FERVJfSF8KLQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYUNhczsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBGYWN0b3J5TG9hZGVyIHsKLXB1YmxpYzoKLSAgICBGYWN0b3J5TG9hZGVyKGNvbnN0IGNoYXIgKm5hbWUpIDoKLSAgICAgICAgbUZhY3RvcnkoTlVMTCksIG1DcmVhdGVGYWN0b3J5RnVuY05hbWUobmFtZSkge30KLQotICAgIHZpcnR1YWwgfkZhY3RvcnlMb2FkZXIoKSB7IGNsb3NlRmFjdG9yeSgpOyB9Ci0KLSAgICBib29sIGZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgICAgICBzcDxTaGFyZWRMaWJyYXJ5PiAqbGlicmFyeSA9IE5VTEwsCi0gICAgICAgICAgICBUKiogZmFjdG9yeSA9IE5VTEwpOwotCi0gICAgYm9vbCBlbnVtZXJhdGVQbHVnaW5zKHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgVCooKkNyZWF0ZUZhY3RvcnlGdW5jKSgpOwotCi0gICAgTXV0ZXggbU1hcExvY2s7Ci0gICAgVCogbUZhY3Rvcnk7Ci0gICAgY29uc3QgY2hhciAqbUNyZWF0ZUZhY3RvcnlGdW5jTmFtZTsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBTdHJpbmc4PiBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXA7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgd3A8U2hhcmVkTGlicmFyeT4gPiBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwOwotCi0gICAgYm9vbCBsb2FkRmFjdG9yeUZvclNjaGVtZUZyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksCi0gICAgICAgICAgICBUKiogZmFjdG9yeSk7Ci0KLSAgICBib29sIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi0gICAgYm9vbCBvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKTsKLSAgICB2b2lkIGNsb3NlRmFjdG9yeSgpOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OmZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksIFQqKiBmYWN0b3J5KSB7Ci0gICAgaWYgKGxpYnJhcnkgIT0gTlVMTCkgewotICAgICAgICBsaWJyYXJ5LT5jbGVhcigpOwotICAgIH0KLSAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICpmYWN0b3J5ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgLy8gZmlyc3QgY2hlY2sgY2FjaGUKLSAgICBzc2l6ZV90IGluZGV4ID0gbUNBU3lzdGVtSWRUb0xpYnJhcnlQYXRoTWFwLmluZGV4T2ZLZXkoQ0Ffc3lzdGVtX2lkKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICByZXR1cm4gbG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXBbaW5kZXhdLAotICAgICAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgbGlicmFyeSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLy8gbm8gbHVjaywgaGF2ZSB0byBzZWFyY2gKLSAgICBTdHJpbmc4IGRpclBhdGgoIi9zeXN0ZW0vbGliL21lZGlhY2FzIik7Ci0gICAgRElSKiBwRGlyID0gb3BlbmRpcihkaXJQYXRoLnN0cmluZygpKTsKLQotICAgIGlmIChwRGlyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHBsdWdpbiBkaXJlY3RvcnkgJXMiLCBkaXJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0cnVjdCBkaXJlbnQqIHBFbnRyeTsKLSAgICB3aGlsZSAoKHBFbnRyeSA9IHJlYWRkaXIocERpcikpKSB7Ci0gICAgICAgIFN0cmluZzggcGx1Z2luUGF0aCA9IGRpclBhdGggKyAiLyIgKyBwRW50cnktPmRfbmFtZTsKLSAgICAgICAgaWYgKHBsdWdpblBhdGguZ2V0UGF0aEV4dGVuc2lvbigpID09ICIuc28iKSB7Ci0gICAgICAgICAgICBpZiAobG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgcGx1Z2luUGF0aCwgQ0Ffc3lzdGVtX2lkLCBsaWJyYXJ5LCBmYWN0b3J5KSkgewotICAgICAgICAgICAgICAgIG1DQVN5c3RlbUlkVG9MaWJyYXJ5UGF0aE1hcC5hZGQoQ0Ffc3lzdGVtX2lkLCBwbHVnaW5QYXRoKTsKLSAgICAgICAgICAgICAgICBjbG9zZWRpcihwRGlyKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xvc2VkaXIocERpcik7Ci0KLSAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgcGx1Z2luIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6ZW51bWVyYXRlUGx1Z2lucygKLSAgICAgICAgdmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cykgewotICAgIEFMT0dJKCJlbnVtZXJhdGVQbHVnaW5zIik7Ci0KLSAgICByZXN1bHRzLT5jbGVhcigpOwotCi0gICAgU3RyaW5nOCBkaXJQYXRoKCIvc3lzdGVtL2xpYi9tZWRpYWNhcyIpOwotICAgIERJUiogcERpciA9IG9wZW5kaXIoZGlyUGF0aC5zdHJpbmcoKSk7Ci0KLSAgICBpZiAocERpciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBwbHVnaW4gZGlyZWN0b3J5ICVzIiwgZGlyUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgc3RydWN0IGRpcmVudCogcEVudHJ5OwotICAgIHdoaWxlICgocEVudHJ5ID0gcmVhZGRpcihwRGlyKSkpIHsKLSAgICAgICAgU3RyaW5nOCBwbHVnaW5QYXRoID0gZGlyUGF0aCArICIvIiArIHBFbnRyeS0+ZF9uYW1lOwotICAgICAgICBpZiAocGx1Z2luUGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCkgPT0gIi5zbyIpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKHBsdWdpblBhdGgsIHJlc3VsdHMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6bG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIHNwPFNoYXJlZExpYnJhcnk+ICpsaWJyYXJ5LCBUKiogZmFjdG9yeSkgewotICAgIGNsb3NlRmFjdG9yeSgpOwotCi0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCAhbUZhY3RvcnktPmlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgewotICAgICAgICBjbG9zZUZhY3RvcnkoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChsaWJyYXJ5ICE9IE5VTEwpIHsKLSAgICAgICAgKmxpYnJhcnkgPSBtTGlicmFyeTsKLSAgICB9Ci0gICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAqZmFjdG9yeSA9IG1GYWN0b3J5OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OnF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICBjb25zdCBTdHJpbmc4ICZwYXRoLCB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgY2xvc2VGYWN0b3J5KCk7Ci0KLSAgICB2ZWN0b3I8Q2FzUGx1Z2luRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnM7Ci0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCBtRmFjdG9yeS0+cXVlcnlQbHVnaW5zKCZkZXNjcmlwdG9ycykgIT0gT0spIHsKLSAgICAgICAgY2xvc2VGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBkZXNjcmlwdG9ycy5iZWdpbigpOyBpdCAhPSBkZXNjcmlwdG9ycy5lbmQoKTsgaXQrKykgewotICAgICAgICByZXN1bHRzLT5wdXNoX2JhY2soUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgaXQtPkNBX3N5c3RlbV9pZCwgaXQtPm5hbWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBGYWN0b3J5TG9hZGVyPFQ+OjpvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKSB7Ci0gICAgLy8gZ2V0IHN0cm9uZyBwb2ludGVyIHRvIG9wZW4gc2hhcmVkIGxpYnJhcnkKLSAgICBzc2l6ZV90IGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5pbmRleE9mS2V5KHBhdGgpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIG1MaWJyYXJ5ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcFtpbmRleF0ucHJvbW90ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5hZGQocGF0aCwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKCFtTGlicmFyeS5nZXQoKSkgewotICAgICAgICBtTGlicmFyeSA9IG5ldyBTaGFyZWRMaWJyYXJ5KHBhdGgpOwotICAgICAgICBpZiAoISptTGlicmFyeSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5yZXBsYWNlVmFsdWVBdChpbmRleCwgbUxpYnJhcnkpOwotICAgIH0KLQotICAgIENyZWF0ZUZhY3RvcnlGdW5jIGNyZWF0ZUZhY3RvcnkgPQotICAgICAgICAoQ3JlYXRlRmFjdG9yeUZ1bmMpbUxpYnJhcnktPmxvb2t1cChtQ3JlYXRlRmFjdG9yeUZ1bmNOYW1lKTsKLSAgICBpZiAoY3JlYXRlRmFjdG9yeSA9PSBOVUxMIHx8IChtRmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoKSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgRmFjdG9yeUxvYWRlcjxUPjo6Y2xvc2VGYWN0b3J5KCkgewotICAgIGRlbGV0ZSBtRmFjdG9yeTsKLSAgICBtRmFjdG9yeSA9IE5VTEw7Ci0gICAgbUxpYnJhcnkuY2xlYXIoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTEyODMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUNhc1NlcnZpY2UiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Nhc0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9EZXNjcmFtYmxlckFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL0Nhc0ltcGwuaD4KLSNpbmNsdWRlIDxtZWRpYS9EZXNjcmFtYmxlckltcGwuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0jaW5jbHVkZSAiTWVkaWFDYXNTZXJ2aWNlLmgiCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCkgewotICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKAotICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhLmNhcyIpLCBuZXcgTWVkaWFDYXNTZXJ2aWNlKCkpOwotfQotCi1NZWRpYUNhc1NlcnZpY2U6Ok1lZGlhQ2FzU2VydmljZSgpIDoKLSAgICBtQ2FzTG9hZGVyKG5ldyBGYWN0b3J5TG9hZGVyPENhc0ZhY3Rvcnk+KCJjcmVhdGVDYXNGYWN0b3J5IikpLAotICAgIG1EZXNjcmFtYmxlckxvYWRlcihuZXcgRmFjdG9yeUxvYWRlcjxEZXNjcmFtYmxlckZhY3Rvcnk+KAotICAgICAgICAgICAgImNyZWF0ZURlc2NyYW1ibGVyRmFjdG9yeSIpKSB7Ci19Ci0KLU1lZGlhQ2FzU2VydmljZTo6fk1lZGlhQ2FzU2VydmljZSgpIHsKLSAgICBkZWxldGUgbUNhc0xvYWRlcjsKLSAgICBkZWxldGUgbURlc2NyYW1ibGVyTG9hZGVyOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjplbnVtZXJhdGVQbHVnaW5zKAotICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgQUxPR1YoImVudW1lcmF0ZVBsdWdpbnMiKTsKLQotICAgIG1DYXNMb2FkZXItPmVudW1lcmF0ZVBsdWdpbnMocmVzdWx0cyk7Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc1N5c3RlbUlkU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzU3lzdGVtSWRTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYUNhc1NlcnZpY2U6OmNyZWF0ZVBsdWdpbigKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIGNvbnN0IHNwPElDYXNMaXN0ZW5lcj4gJmxpc3RlbmVyLAotICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImNyZWF0ZVBsdWdpbjogQ0Ffc3lzdGVtX2lkPSVkIiwgQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJlc3VsdC0+Y2xlYXIoKTsKLQotICAgIENhc0ZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkLCAmbGlicmFyeSwgJmZhY3RvcnkpKSB7Ci0gICAgICAgIENhc1BsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgc3A8Q2FzSW1wbD4gY2FzSW1wbCA9IG5ldyBDYXNJbXBsKGxpc3RlbmVyKTsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICh1aW50NjRfdCljYXNJbXBsLmdldCgpLAotICAgICAgICAgICAgICAgICZDYXNJbXBsOjpPbkV2ZW50LCAmcGx1Z2luKSA9PSBPSyAmJiBwbHVnaW4gIT0gTlVMTCkgewotICAgICAgICAgICAgY2FzSW1wbC0+aW5pdChsaWJyYXJ5LCBwbHVnaW4pOwotICAgICAgICAgICAgKnJlc3VsdCA9IGNhc0ltcGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc0Rlc2NyYW1ibGVyU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZShDQV9zeXN0ZW1faWQpOwotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhQ2FzU2VydmljZTo6Y3JlYXRlRGVzY3JhbWJsZXIoCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBzcDxJRGVzY3JhbWJsZXI+KiByZXN1bHQpIHsKLSAgICBBTE9HVigiY3JlYXRlRGVzY3JhbWJsZXI6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICByZXN1bHQtPmNsZWFyKCk7Ci0KLSAgICBEZXNjcmFtYmxlckZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZSgKLSAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgJmxpYnJhcnksICZmYWN0b3J5KSkgewotICAgICAgICBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICZwbHVnaW4pID09IE9LCi0gICAgICAgICAgICAgICAgJiYgcGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpyZXN1bHQgPSBuZXcgRGVzY3JhbWJsZXJJbXBsKGxpYnJhcnksIHBsdWdpbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjgyOGYyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLSNkZWZpbmUgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLQotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUNhc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIkZhY3RvcnlMb2FkZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgQ2FzRmFjdG9yeTsKLXN0cnVjdCBEZXNjcmFtYmxlckZhY3Rvcnk7Ci0KLWNsYXNzIE1lZGlhQ2FzU2VydmljZSA6IHB1YmxpYyBCbk1lZGlhQ2FzU2VydmljZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoKTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGVudW1lcmF0ZVBsdWdpbnMoCi0gICAgICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzU3lzdGVtSWRTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZVBsdWdpbigKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIsCi0gICAgICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZURlc2NyYW1ibGVyKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIHNwPElEZXNjcmFtYmxlcj4qIHJlc3VsdCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgRmFjdG9yeUxvYWRlcjxDYXNGYWN0b3J5PiAqbUNhc0xvYWRlcjsKLSAgICBGYWN0b3J5TG9hZGVyPERlc2NyYW1ibGVyRmFjdG9yeT4gKm1EZXNjcmFtYmxlckxvYWRlcjsKLQotICAgIE1lZGlhQ2FzU2VydmljZSgpOwotICAgIHZpcnR1YWwgfk1lZGlhQ2FzU2VydmljZSgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL21haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKaW5kZXggYjY4NWFlMC4uYjc2N2I4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIk1lZGlhRHJtU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhQ2FzU2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtMzksNyArMzgsNiBAQAogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogICAgIE1lZGlhRHJtU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rIGIvc2VydmljZXMvcmFkaW8vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1MGRjMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIFJhZGlvU2VydmljZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliYXVkaW9jbGllbnQgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJyYWRpbyBcCi0gICAgbGlicmFkaW9fbWV0YWRhdGEKLQotaWZlcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksdHJ1ZSkKLSMgbGliaGFyZHdhcmUgY29uZmlndXJhdGlvbgotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgXAotICAgIFJhZGlvSGFsTGVnYWN5LmNwcAotZWxzZQotIyBUcmVibGUgY29uZmlndXJhdGlvbgotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIEhpZGxVdGlscy5jcHAgXAotICAgIFJhZGlvSGFsSGlkbC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgbGliaHdiaW5kZXIgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJiYXNlIFwKLSAgICBsaWJhdWRpb2hhbCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5icm9hZGNhc3RyYWRpb0AxLjAKLWVuZGlmCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfTU9EVUxFOj0gbGlicmFkaW9zZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5jcHAgYi9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODk1Mzc3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jZGVmaW5lIExPR19UQUcgIkhpZGxVdGlscyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW9fbWV0YWRhdGEuaD4KLQotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6TWV0YWRhdGFUeXBlOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpCYW5kOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpEZWVtcGhhc2lzOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpSZHM7Ci0KLS8vc3RhdGljCi1pbnQgSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KFJlc3VsdCByZXN1bHQpCi17Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzoKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURToKLSAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOwotICAgICAgICBjYXNlIFJlc3VsdDo6VElNRU9VVDoKLSAgICAgICAgICAgIHJldHVybiAtRVRJTUVET1VUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotfQotCi0KLS8vc3RhdGljCi12b2lkIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdUb0hhbChCYW5kQ29uZmlnICpoYWxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKQotewotICAgIGhhbENvbmZpZy0+dHlwZSA9IHN0YXRpY19jYXN0PEJhbmQ+KGNvbmZpZy0+dHlwZSk7Ci0gICAgaGFsQ29uZmlnLT5hbnRlbm5hQ29ubmVjdGVkID0gY29uZmlnLT5hbnRlbm5hX2Nvbm5lY3RlZDsKLSAgICBoYWxDb25maWctPmxvd2VyTGltaXQgPSBjb25maWctPmxvd2VyX2xpbWl0OwotICAgIGhhbENvbmZpZy0+dXBwZXJMaW1pdCA9IGNvbmZpZy0+dXBwZXJfbGltaXQ7Ci0gICAgaGFsQ29uZmlnLT5zcGFjaW5ncy5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KCZjb25maWctPnNwYWNpbmdzWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bnVtX3NwYWNpbmdzICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgLy8gRklYTUU6IHRyYW5zZmVyIGJ1ZmZlciBvd25lcnNoaXAuIHNob3VsZCBoYXZlIGEgbWV0aG9kIGZvciB0aGF0IGluIGhpZGxfdmVjCi0gICAgaGFsQ29uZmlnLT5zcGFjaW5ncy5yZXNpemUoY29uZmlnLT5udW1fc3BhY2luZ3MpOwotCi0gICAgaWYgKGhhbENvbmZpZy0+dHlwZSA9PSBCYW5kOjpGTSkgewotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5kZWVtcGhhc2lzID0gc3RhdGljX2Nhc3Q8RGVlbXBoYXNpcz4oY29uZmlnLT5mbS5kZWVtcGhhc2lzKTsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0uc3RlcmVvID0gY29uZmlnLT5mbS5zdGVyZW87Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLnJkcyA9IHN0YXRpY19jYXN0PFJkcz4oY29uZmlnLT5mbS5yZHMpOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS50YSA9IGNvbmZpZy0+Zm0udGE7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLmFmID0gY29uZmlnLT5mbS5hZjsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0uZWEgPSBjb25maWctPmZtLmVhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmFtLnN0ZXJlbyA9IGNvbmZpZy0+YW0uc3RlcmVvOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0UHJvcGVydGllc0Zyb21IYWwocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvcGVydGllcyAqaGFsUHJvcGVydGllcykKLXsKLSAgICBwcm9wZXJ0aWVzLT5jbGFzc19pZCA9IHN0YXRpY19jYXN0PHJhZGlvX2NsYXNzX3Q+KGhhbFByb3BlcnRpZXMtPmNsYXNzSWQpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+aW1wbGVtZW50b3IsIGhhbFByb3BlcnRpZXMtPmltcGxlbWVudG9yLmNfc3RyKCksIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnByb2R1Y3QsIGhhbFByb3BlcnRpZXMtPnByb2R1Y3QuY19zdHIoKSwgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+dmVyc2lvbiwgaGFsUHJvcGVydGllcy0+dmVyc2lvbi5jX3N0cigpLCBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5zZXJpYWwsIGhhbFByb3BlcnRpZXMtPnNlcmlhbC5jX3N0cigpLCBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgcHJvcGVydGllcy0+bnVtX3R1bmVycyA9IGhhbFByb3BlcnRpZXMtPm51bVR1bmVyczsKLSAgICBwcm9wZXJ0aWVzLT5udW1fYXVkaW9fc291cmNlcyA9IGhhbFByb3BlcnRpZXMtPm51bUF1ZGlvU291cmNlczsKLSAgICBwcm9wZXJ0aWVzLT5zdXBwb3J0c19jYXB0dXJlID0gaGFsUHJvcGVydGllcy0+c3VwcG9ydHNDYXB0dXJlOwotICAgIHByb3BlcnRpZXMtPm51bV9iYW5kcyA9IGhhbFByb3BlcnRpZXMtPmJhbmRzLnNpemUoKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsUHJvcGVydGllcy0+YmFuZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29udmVydEJhbmRDb25maWdGcm9tSGFsKCZwcm9wZXJ0aWVzLT5iYW5kc1tpXSwgJmhhbFByb3BlcnRpZXMtPmJhbmRzW2ldKTsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdGcm9tSGFsKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhbmRDb25maWcgKmhhbENvbmZpZykKLXsKLSAgICBjb25maWctPnR5cGUgPSBzdGF0aWNfY2FzdDxyYWRpb19iYW5kX3Q+KGhhbENvbmZpZy0+dHlwZSk7Ci0gICAgY29uZmlnLT5hbnRlbm5hX2Nvbm5lY3RlZCA9IGhhbENvbmZpZy0+YW50ZW5uYUNvbm5lY3RlZDsKLSAgICBjb25maWctPmxvd2VyX2xpbWl0ID0gaGFsQ29uZmlnLT5sb3dlckxpbWl0OwotICAgIGNvbmZpZy0+dXBwZXJfbGltaXQgPSBoYWxDb25maWctPnVwcGVyTGltaXQ7Ci0gICAgY29uZmlnLT5udW1fc3BhY2luZ3MgPSBoYWxDb25maWctPnNwYWNpbmdzLnNpemUoKTsKLSAgICBpZiAoY29uZmlnLT5udW1fc3BhY2luZ3MgPiBSQURJT19OVU1fU1BBQ0lOR1NfTUFYKSB7Ci0gICAgICAgIGNvbmZpZy0+bnVtX3NwYWNpbmdzID0gUkFESU9fTlVNX1NQQUNJTkdTX01BWDsKLSAgICB9Ci0gICAgbWVtY3B5KGNvbmZpZy0+c3BhY2luZ3MsIGhhbENvbmZpZy0+c3BhY2luZ3MuZGF0YSgpLAotICAgICAgICAgICBzaXplb2YodWludDMyX3QpICogY29uZmlnLT5udW1fc3BhY2luZ3MpOwotCi0gICAgaWYgKGhhbENvbmZpZy0+dHlwZSA9PSBCYW5kOjpGTSkgewotICAgICAgICBjb25maWctPmZtLmRlZW1waGFzaXMgPSBzdGF0aWNfY2FzdDxyYWRpb19kZWVtcGhhc2lzX3Q+KGhhbENvbmZpZy0+ZXh0LmZtLmRlZW1waGFzaXMpOwotICAgICAgICBjb25maWctPmZtLnN0ZXJlbyA9IGhhbENvbmZpZy0+ZXh0LmZtLnN0ZXJlbzsKLSAgICAgICAgY29uZmlnLT5mbS5yZHMgPSBzdGF0aWNfY2FzdDxyYWRpb19yZHNfdD4oaGFsQ29uZmlnLT5leHQuZm0ucmRzKTsKLSAgICAgICAgY29uZmlnLT5mbS50YSA9IGhhbENvbmZpZy0+ZXh0LmZtLnRhOwotICAgICAgICBjb25maWctPmZtLmFmID0gaGFsQ29uZmlnLT5leHQuZm0uYWY7Ci0gICAgICAgIGNvbmZpZy0+Zm0uZWEgPSBoYWxDb25maWctPmV4dC5mbS5lYTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25maWctPmFtLnN0ZXJlbyA9IGhhbENvbmZpZy0+ZXh0LmFtLnN0ZXJlbzsKLSAgICB9Ci19Ci0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbUluZm8gKmhhbEluZm8pCi17Ci0gICAgaW5mby0+Y2hhbm5lbCA9IGhhbEluZm8tPmNoYW5uZWw7Ci0gICAgaW5mby0+c3ViX2NoYW5uZWwgPSBoYWxJbmZvLT5zdWJDaGFubmVsOwotICAgIGluZm8tPnR1bmVkID0gaGFsSW5mby0+dHVuZWQ7Ci0gICAgaW5mby0+c3RlcmVvID0gaGFsSW5mby0+c3RlcmVvOwotICAgIGluZm8tPmRpZ2l0YWwgPSBoYWxJbmZvLT5kaWdpdGFsOwotICAgIGluZm8tPnNpZ25hbF9zdHJlbmd0aCA9IGhhbEluZm8tPnNpZ25hbFN0cmVuZ3RoOwotICAgIGNvbnZlcnRNZXRhRGF0YUZyb21IYWwoJmluZm8tPm1ldGFkYXRhLCBoYWxJbmZvLT5tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEluZm8tPmNoYW5uZWwsIGhhbEluZm8tPnN1YkNoYW5uZWwpOwotfQotCi0vLyBUT0RPKHR3YXNpbGN6eWspOiBkcm9wIHVubmVjZXNzYXJ5IGNoYW5uZWwgaW5mbwotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0TWV0YURhdGFGcm9tSGFsKHJhZGlvX21ldGFkYXRhX3QgKiptZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPE1ldGFEYXRhPiYgaGFsTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3ViQ2hhbm5lbCBfX3VudXNlZCkKLXsKLQotICAgIGlmIChtZXRhZGF0YSA9PSBudWxscHRyIHx8ICptZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJkZXN0aW5hdGlvbiBtZXRhZGF0YSBidWZmZXIgaXMgYSBudWxscHRyIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxNZXRhZGF0YS5zaXplKCk7IGkrKykgewotICAgICAgICByYWRpb19tZXRhZGF0YV9rZXlfdCBrZXkgPSBzdGF0aWNfY2FzdDxyYWRpb19tZXRhZGF0YV9rZXlfdD4oaGFsTWV0YWRhdGFbaV0ua2V5KTsKLSAgICAgICAgcmFkaW9fbWV0YWRhdGFfdHlwZV90IHR5cGUgPSBzdGF0aWNfY2FzdDxyYWRpb19tZXRhZGF0YV9rZXlfdD4oaGFsTWV0YWRhdGFbaV0udHlwZSk7Ci0gICAgICAgIHJhZGlvX21ldGFkYXRhX2Nsb2NrX3QgY2xvY2s7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9JTlQ6Ci0gICAgICAgICAgICByYWRpb19tZXRhZGF0YV9hZGRfaW50KG1ldGFkYXRhLCBrZXksIGhhbE1ldGFkYXRhW2ldLmludFZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBRElPX01FVEFEQVRBX1RZUEVfVEVYVDoKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF90ZXh0KG1ldGFkYXRhLCBrZXksIGhhbE1ldGFkYXRhW2ldLnN0cmluZ1ZhbHVlLmNfc3RyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9SQVc6Ci0gICAgICAgICAgICByYWRpb19tZXRhZGF0YV9hZGRfcmF3KG1ldGFkYXRhLCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbE1ldGFkYXRhW2ldLnJhd1ZhbHVlLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0ucmF3VmFsdWUuc2l6ZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBRElPX01FVEFEQVRBX1RZUEVfQ0xPQ0s6Ci0gICAgICAgICAgICBjbG9jay51dGNfc2Vjb25kc19zaW5jZV9lcG9jaCA9Ci0gICAgICAgICAgICAgICAgICAgIGhhbE1ldGFkYXRhW2ldLmNsb2NrVmFsdWUudXRjU2Vjb25kc1NpbmNlRXBvY2g7Ci0gICAgICAgICAgICBjbG9jay50aW1lem9uZV9vZmZzZXRfaW5fbWludXRlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGhhbE1ldGFkYXRhW2ldLmNsb2NrVmFsdWUudGltZXpvbmVPZmZzZXRJbk1pbnV0ZXM7Ci0gICAgICAgICAgICByYWRpb19tZXRhZGF0YV9hZGRfY2xvY2sobWV0YWRhdGEsIGtleSwgJmNsb2NrKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIiVzIGludmFsaWQgbWV0YWRhdGEgdHlwZSAldSIsX19GVU5DVElPTl9fLCBoYWxNZXRhZGF0YVtpXS50eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmggYi9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3MTA2MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX1VUSUxTX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9VVElMU19ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpSZXN1bHQ7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb3BlcnRpZXM7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkJhbmRDb25maWc7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb2dyYW1JbmZvOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpNZXRhRGF0YTsKLQotY2xhc3MgSGlkbFV0aWxzIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgaW50IGNvbnZlcnRIYWxSZXN1bHQoUmVzdWx0IHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydEJhbmRDb25maWdGcm9tSGFsKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhbmRDb25maWcgKmhhbENvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydFByb3BlcnRpZXNGcm9tSGFsKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnRpZXMgKmhhbFByb3BlcnRpZXMpOwotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRCYW5kQ29uZmlnVG9IYWwoQmFuZENvbmZpZyAqaGFsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydFByb2dyYW1JbmZvRnJvbUhhbChyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1JbmZvICpoYWxJbmZvKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFGcm9tSGFsKHJhZGlvX21ldGFkYXRhX3QgKiptZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPE1ldGFEYXRhPiYgaGFsTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3ViQ2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfVVRJTFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vT1dORVJTIGIvc2VydmljZXMvcmFkaW8vT1dORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk1NDlhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL09XTkVSUworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZWxhdXJlbnRAZ29vZ2xlLmNvbQotaHVuZ2FAZ29vZ2xlLmNvbQotdHdhc2lsY3p5a0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuY3BwIGIvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzNzI3NS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmg+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+bWV0YWRhdGEgaXMgTlVMTC4gbm8gbWV0YSBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICAgICAgICogSWYgbWV0YSBkYXRhIG11c3QgYmUgcmV0dXJuZWQsIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvIG9yIGNsb25lZCB0bwotICAgICAgICAgKiBpbmZvLT5tZXRhZGF0YSwgbm90IHBhc3NlZCBmcm9tIGEgbmV3bHkgY3JlYXRlZCBtZXRhIGRhdGEgYnVmZmVyLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiB0dW5lZCBhbmQgaW5mb3JtYXRpb24gYXZhaWxhYmxlCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgICAgICAgICBUdW5lckludGVyZmFjZSgpIHt9Ci0gICAgdmlydHVhbCAgICAgflR1bmVySW50ZXJmYWNlKCkge30KLQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9JTlRFUkZBQ0VfSAo=